如何在 Excel 中提取两个单词之间的字符,但从右到左搜索

如何在 Excel 中提取两个单词之间的字符,但从右到左搜索

目前我在单元格 A1 中有这个:

“timeZone”:“Etc/UTC”},“body”:“[~kevin.tom] [~sergio.Melle] [~seema.item] 报告是否已发送给客户?“,”updateAuthor“:“body”:“[~katelyn.robert] \r\n \r\n还没有”,“updateAuthor”:

我想提取

“身体”:”

","更新作者

正如您在 A1 中看到的,如果我将内容拆分为“body”:“和”,“updateAuthor”,我们会得到两个结果:

[~kevin.tom] [~sergio.Melle] [~seema.item] 报告交给客户了吗?

[~katelyn.robert]\r\n\r\n尚未”,“更新作者

我希望能够提取最后的结果,即

[~katelyn.robert]\r\n\r\n尚未”,“更新作者

我将始终向单元格 A1 添加更多内容,并且我需要单元格 B1 更新并提取最后的结果,无论它是什么。

目前,我能够在单元格 B1 中得出以下代码:

=MID(B1,FIND("body",B1)+7,FIND("updateAuthor",B1,FIND("body",B1)+1)-FIND("body",B1)-10)

这对我来说有效,但它提取了找到的第一个结果,而我想要的是最后一个结果。本质上,excel 从左到右搜索,而我希望它从右到左搜索。有人知道如何修改它以使其工作吗?

目前,使用 B1 中的代码,我在 B1 中得到了以下信息:

[~kevin.tom] [~sergio.Melle] [~seema.item] 报告交给客户了吗?

但我想要的是这个:

[~katelyn.robert]\r\n\r\n还没有

我试图在不使用 VBA 的情况下实现这一点

答案1

好的,我只是想说,我确实相信使用 VBA 会更容易解决这个问题,但我很好奇,想把它作为一个公式来做。

=MID(A1,FIND("body",A1,FIND("body",A1,1)+1)+7,FIND("updateAuthor",A1,FIND("updateAuthor",A1,1)+1)-(FIND("body",A1,FIND("body",A1,1)+1)+10))

这假设您可以像在提供的公式中一样使用“body”和“updateAuthor”。如果您确实想查找带有标点符号的字符串,例如,则"body"."查找将需要类似CHAR(34) & "body" & CHAR(34) & ":" & CHAR(34)和的内容CHAR(34) & "," & CHAR(34) & "updateAuthor"。如果这样做,您还必须更改添加的偏移数字(+7 和 +10)。

这也假设单元格中有且只有两个作者。如果作者数量不定,则此方法将不起作用。

Mid 函数的语法是MID(text,start_num,num_chars)

Find 函数的语法是FIND(find_text,within_text,start_num)

FIND("body",A1,FIND("body",A1,1)+1)+7

这为您提供了 Mid 函数的起始数字。

内部 findFIND("body",A1,1)返回 A1 中第一次出现“body”的位置。您需要在该位置上加 1 作为下一次 find 的起始编号,否则您将得到相同的位置。然后外部 find 再次在 A1 中查找“body”,但开始查找第一次出现位置后一个字符。您必须添加偏移量才能找到第一个字符的位置,"body":"因为 find 函数会告诉您在哪里b

FIND("updateAuthor",A1,FIND("updateAuthor",A1,1)+1)-(FIND("body",A1,FIND("body",A1,1)+1)+10

这将为您提供 Mid 函数的字符数。

这些递归查找语句的工作方式与上面的相同,用于查找作者信息的开始和结束标记的开始之间的差异,","updateAuthor并在末尾添加适当的偏移量。

答案2

如果您重新考虑并接受 VBA,那么请考虑以下用户定义函数:

Public Function GrabData(s As String) As String
    Dim dq As String
    dq = Chr(34)
    arr = Split(s, "body" & dq & ":" & dq)
    brr = Split(arr(UBound(arr)), dq & "," & dq & "updateAuthor")
    GrabData = brr(0)
End Function

在此处输入图片描述

答案3

如果您可以接受字符串长度的限制,那么您可以这样做:

=MAX(IFERROR(SEARCH("body",A1,{1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16, [...etc...],250  }),0))

只要小于 250,这将为您提供 A1 中“body”的最后一个实例的起点。在原始公式中或辅助单元格中使用此技巧。

解释:{range} 使其成为一个数组公式,从不同的起点进行搜索,而 MAX() 返回数组中的最高元素。IFERROR 将 VALUE 错误(起点太靠右)替换为零。

如果您使用 EXCEL 365,那就更简单了:

=MAX(IFERROR(SEARCH("body",A1,SEQUENCE(LEN(A1),,0,1)),0))

这将动态生成具有正确长度的数组。

相关内容