是否有一种有效的方法来识别字符串中使用基函数的最后一个字符/字符串匹配?也就是说,不是字符串的最后一个字符/字符串,而是字符/字符串在字符串中最后出现的位置。搜索和查找都从左到右工作,所以我不知道如何应用没有冗长的递归算法。现在看来,这种解决方案已经过时了。
当前回答
对于A1中的字符串和B1中的子字符串,使用:
= XMATCH (B1,中期(A1,序列(LEN (A1)), LEN (B1)),, 1)
从内到外,MID(A1,SEQUENCE(LEN(A1)),LEN(B1))将字符串A1拆分为一个动态的子字符串数组,每个子字符串的长度为B1。为了找到子字符串B1最后出现的位置,我们使用XMATCH并将其Search_mode参数设置为-1。
其他回答
您可以使用我创建的这个函数来查找字符串中的字符串的最后一个实例。
当然,公认的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, "\"))
新答案| 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有一个内置的函数,InStrRev,它所做的正是您正在寻找的。
把这个放到一个新模块中:
Function RSearch(str As String, find As String)
RSearch = InStrRev(str, find)
End Function
你的函数看起来像这样(假设原始字符串在B1中):
=LEFT(B1,RSearch(B1,"\"))
tigeravatar和Jean-François Corbett建议使用这个公式来生成“\”字符最后一次出现的右侧的字符串
=TRIM(RIGHT(SUBSTITUTE(A1,"\",REPT(" ",LEN(A1))),LEN(A1)))
如果用作分隔符的字符是空格," ",则公式必须更改为:
=SUBSTITUTE(RIGHT(SUBSTITUTE(A1," ",REPT("{",LEN(A1))),LEN(A1)),"{","")
不用说,“{”字符可以替换为任何“通常”不会出现在要处理的文本中的字符。
推荐文章
- Excel:匹配字符串中的最后一个字符/字符串
- .text, .value和.value2之间的区别是什么?
- 从c#读取Excel文件
- 检查单元格是否包含子字符串
- 在Excel中从公式返回空单元格
- 熊猫:在excel文件中查找表格列表
- 循环通过文件夹中的文件使用VBA?
- 将公式应用到Excel中的整个列的快捷方式
- 在现有Excel值中添加前导0 /0到一定长度
- 如何从一个VBA函数返回一个结果
- 如何在Excel中创建包含双引号的字符串或公式?
- 使用Pandas对同一工作簿的多个工作表进行pd.read_excel()
- 在Linux中用命令行将xlsx转换为csv
- 设置excel文档的mime类型
- excel文件的正确内容类型是什么?