是否有一种有效的方法来识别字符串中使用基函数的最后一个字符/字符串匹配?也就是说,不是字符串的最后一个字符/字符串,而是字符/字符串在字符串中最后出现的位置。搜索和查找都从左到右工作,所以我不知道如何应用没有冗长的递归算法。现在看来,这种解决方案已经过时了。


当前回答

新答案| 31-3-2022:

更新的功能会带来更短的答案。在编写测试版时,我们可以使用TEXTBEFORE(),但在不久的将来可能会广泛使用:

=LEN(TEXTBEFORE(A2,B2,-1))+1

这里的技巧是,第3个形参告诉函数检索我们在第二个形参中给出的子字符串的最后一次出现。在编写此函数时,默认情况下该函数仍然是区分大小写的,可以由可选的第4个参数处理。


原答案| 17-6-2020:

新版本的excel有了新的函数,也就有了新的方法。虽然它可以在旧版本中复制(但我以前没有见过),当你有Excel O365时,你可以使用:

=MATCH(2,1/(MID(A1,SEQUENCE(LEN(A1)),1)="Y"))

这也可以用来检索(重叠)子字符串的最后位置:

=MATCH(2,1/(MID(A1,SEQUENCE(LEN(A1)),2)="YY"))

| Value  | Pattern | Formula                                        | Position |
|--------|---------|------------------------------------------------|----------|
| XYYZ   | Y       | =MATCH(2,1/(MID(A2,SEQUENCE(LEN(A2)),1)="Y"))  | 3        |
| XYYYZ  | YY      | =MATCH(2,1/(MID(A3,SEQUENCE(LEN(A3)),2)="YY")) | 3        |
| XYYYYZ | YY      | =MATCH(2,1/(MID(A4,SEQUENCE(LEN(A4)),2)="YY")) | 4        |

虽然这既允许我们不再使用任意替换字符,也允许重叠模式,但“缺点”是使用数组。


注意:你可以在旧的Excel版本中强制相同的行为

=MATCH(2,1/(MID(A2,ROW(A1:INDEX(A:A,LEN(A2))),1)="Y"))

通过CtrlShiftEnter输入,或者使用内联INDEX来消除隐式交集:

=MATCH(2,INDEX(1/(MID(A2,ROW(A1:INDEX(A:A,LEN(A2))),1)="Y"),))

其他回答

tigeravatar和Jean-François Corbett建议使用这个公式来生成“\”字符最后一次出现的右侧的字符串

=TRIM(RIGHT(SUBSTITUTE(A1,"\",REPT(" ",LEN(A1))),LEN(A1)))

如果用作分隔符的字符是空格," ",则公式必须更改为:

=SUBSTITUTE(RIGHT(SUBSTITUTE(A1," ",REPT("{",LEN(A1))),LEN(A1)),"{","")

不用说,“{”字符可以替换为任何“通常”不会出现在要处理的文本中的字符。

如果您只查找字符“~”的最后一个实例的位置,那么 = len(替代(字符串 ,"~",""))+ 1

我确信有一个版本将与字符串的最后一个实例一起工作,但我必须回去工作。

如何创建一个自定义函数并在您的公式中使用它?VBA有一个内置的函数,InStrRev,它所做的正是您正在寻找的。

把这个放到一个新模块中:

Function RSearch(str As String, find As String)
    RSearch = InStrRev(str, find)
End Function

你的函数看起来像这样(假设原始字符串在B1中):

=LEFT(B1,RSearch(B1,"\"))

很晚了,但是一个简单的解决方案是使用VBA创建一个自定义函数。

将功能添加到工作簿、工作表或VBA模块中的VBA

Function LastSegment(S, C)
    LastSegment = Right(S, Len(S) - InStrRev(S, C))
End Function

然后是单元格公式

=lastsegment(B1,"/")

在单元格中,在单元格B1中要搜索的字符串将用单元格B1中以最后一个“/”结尾的文本填充该单元格。 没有长度限制,没有晦涩的公式。 我认为唯一的缺点是需要启用宏的工作簿。

任何用户VBA函数都可以以这种方式调用,以向单元格公式返回值,包括作为内置Excel函数的参数。

如果你打算大量使用这个函数,你会想要检查字符不在字符串中,字符串为空等情况。

在VBA中一个简单的方法是:

YourText = "c:\excel\text.txt"
xString = Mid(YourText, 2 + Len(YourText) - InStr(StrReverse(YourText), "\" ))