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


当前回答

我想我明白你的意思了。假设你想要下面字符串中最右边的\(存储在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中一个简单的方法是:

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

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

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

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

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

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

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

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

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

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

=FIND(B1,A1)-1

在新版本的Excel(2013年及以上)中,闪光填充可能是一个简单而快速的解决方案:在Excel中使用闪光填充 .