如果通配符旨在考虑不同的串联选项,则TEXTAFTER
是一个很好的候选函数,可以在给定子字符串出现第n次后提取文本。问题是TEXTAFTER/TEXTBEFORE
函数不接受通配符值。为了做到这一点,您需要解析所有具有特定值的串联选项。
如果要查找的带有通配符的文本位于文本A2
内的单元格B2
上。在C2
中放入以下公式,以提取查找值的最后一个实例之前的文本:
=LET(lk,TEXTSPLIT(B2,"*"), del,TAKE(lk,,1)&{"-";" "}&TAKE(lk,,-1),
after, TEXTAFTER(A2, del,-1,1), SUBSTITUTE(A2, after, ""))
注意事项:
- If you want to extract just up to the
n
-th occurrence of the lookup value, then replace -1
in TEXTAFTER
with the number of occurrence (n
) you want to consider.
- The solution assumes there is always a wildcard (
*
) in the text to find. The solution can be extended to a more general case, when the exact text is provided (no *
). For example checking the number of columns of lk
. The case of no wildcards returns just a single column.
它所做的是通过TEXTSPLIT
用通配符拆分查找值,然后通过串联构建TEXTAFTER
中使用的所有可能的分隔符,考虑每两个单词的分隔符列表:{“-”;“}
。对于本例,del
的值为:
Full-time
Full time
现在,我们使用TEXTAFTER
来查找任何分隔符(del
)的最后一个出现(1
,最后一个输入参数),并进行不区分大小写的搜索。一旦我们在最后一个分隔符之后有了文本(之后的),我们就使用SUBSTITUTION
来获取之前的文本。
Find last occurrence of a given substring
这是另一种方法。您可以在名称管理器中创建以下递归函数SEARCLAST
:
=LAMBDA(lk,txt,[init],[last], LET(
i, IF(ISOMITTED(init), 1, init),
prev, IF(ISOMITTED(last), 0, last),
current, SEARCH(lk, txt, i),
IF(ISERR(current), prev, SEARCHLAST(lk, txt, current+1,current))
))
现在按如下方式使用它:
=LET(txt,A2, lk,B2, last,SEARCHLAST(lk,txt), snd,TAKE(TEXTSPLIT(lk, "*"),,-1),
endTkn, SEARCH(snd, txt,last+1)+LEN(snd)-1,
LEFT(txt, endTkn))
这种方法的问题在于,您需要避免误报,这是因为SEARCH/FIND
函数是如何工作的。如果您在输入文本中有全职
而不是全日制
,它也会找到这个词,因此您需要以防止它出现的方式构建查找值,例如在末尾添加一个空格,在开头添加一个可选空格。
它所做的基本上是递归调用SEARCLAST
,直到找不到值,然后取上一次迭代的值(prev
)。它使用ISOMITTED
函数来考虑一些输入参数(用括号[]
分隔)作为可选参数,以具有更友好的用户界面。