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


当前回答

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

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

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

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

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

其他回答

考虑到@SSilk所做的评论的一部分,我的最终目标真的是让一切都正确的最后一次出现,一个非常简单的公式的替代方法是复制字符串的列(说a),并在副本(说ColumnB)应用查找和替换。以驱动器:\文件夹\子文件夹\文件名.ext为例

这将返回所选择字符(这里\)的最后一个实例(这里是\)之后的剩余内容(这里是Filename.ext),这有时是目标,并且有助于用一个简短的公式找到最后一个这样的字符的位置,例如:

=FIND(B1,A1)-1

新答案| 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"),))

我想我明白你的意思了。假设你想要下面字符串中最右边的\(存储在A1单元格中):

驱动器:\ \子文件夹Filename文件夹。请拨分机

为了得到最后一个\的位置,你可以使用这个公式:

=FIND("@",SUBSTITUTE(A1,"\","@",(LEN(A1)-LEN(SUBSTITUTE(A1,"\","")))/LEN("\")))

这告诉我们最右边的\在第24个字符。它通过查找“@”并将最后一个“\”替换为“@”来实现这一点。它通过使用来确定最后一个

(len(string)-len(substitute(string, substring, "")))\len(substring)

在这种情况下,子字符串就是长度为1的“\”,所以你可以在结尾省去除法,只使用:

=FIND("@",SUBSTITUTE(A1,"\","@",LEN(A1)-LEN(SUBSTITUTE(A1,"\",""))))

现在我们可以使用它来获取文件夹路径:

=LEFT(A1,FIND("@",SUBSTITUTE(A1,"\","@",LEN(A1)-LEN(SUBSTITUTE(A1,"\","")))))

下面是没有结尾\的文件夹路径

=LEFT(A1,FIND("@",SUBSTITUTE(A1,"\","@",LEN(A1)-LEN(SUBSTITUTE(A1,"\",""))))-1)

要获得文件名:

=MID(A1,FIND("@",SUBSTITUTE(A1,"\","@",LEN(A1)-LEN(SUBSTITUTE(A1,"\",""))))+1,LEN(A1))

但是,这里有一个替代版本,可以使所有内容都位于特定字符的最后一个实例的右侧。所以使用我们同样的例子,这也会返回文件名:

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

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

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

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

然后是单元格公式

=lastsegment(B1,"/")

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

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

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

您可以使用我创建的这个函数来查找字符串中的字符串的最后一个实例。

当然,公认的Excel公式是可行的,但它太难以阅读和使用。在某种程度上,你必须把它分解成更小的块,这样它才可维护。下面的函数是可读的,但这无关紧要,因为您在使用命名参数的公式中调用它。这使得使用它很简单。

Public Function FindLastCharOccurence(fromText As String, searchChar As String) As Integer
Dim lastOccur As Integer
lastOccur = -1
Dim i As Integer
i = 0
For i = Len(fromText) To 1 Step -1
    If Mid(fromText, i, 1) = searchChar Then
        lastOccur = i
        Exit For
    End If
Next i

FindLastCharOccurence = lastOccur
End Function

我是这样使用的:

=RIGHT(A2, LEN(A2) - FindLastCharOccurence(A2, "\"))