目前我在单元格 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
答案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))
这将动态生成具有正确长度的数组。