是否有一种有效的方法来识别字符串中使用基函数的最后一个字符/字符串匹配?也就是说,不是字符串的最后一个字符/字符串,而是字符/字符串在字符串中最后出现的位置。搜索和查找都从左到右工作,所以我不知道如何应用没有冗长的递归算法。现在看来,这种解决方案已经过时了。
当前回答
如何创建一个自定义函数并在您的公式中使用它?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)),"{","")
不用说,“{”字符可以替换为任何“通常”不会出现在要处理的文本中的字符。
刚想出这个解决方案,不需要VBA;
找到我的例子中最后出现的“_”;
=IFERROR(FIND(CHAR(1);SUBSTITUTE(A1;"_";CHAR(1);LEN(A1)-LEN(SUBSTITUTE(A1;"_";"")));0)
由内而外解释;
SUBSTITUTE(A1;"_";"") => replace "_" by spaces
LEN( *above* ) => count the chars
LEN(A1)- *above* => indicates amount of chars replaced (= occurrences of "_")
SUBSTITUTE(A1;"_";CHAR(1); *above* ) => replace the Nth occurence of "_" by CHAR(1) (Nth = amount of chars replaced = the last one)
FIND(CHAR(1); *above* ) => Find the CHAR(1), being the last (replaced) occurance of "_" in our case
IFERROR( *above* ;"0") => in case no chars were found, return "0"
希望这对你有帮助。
在VBA中一个简单的方法是:
YourText = "c:\excel\text.txt"
xString = Mid(YourText, 2 + Len(YourText) - InStr(StrReverse(YourText), "\" ))
如何创建一个自定义函数并在您的公式中使用它?VBA有一个内置的函数,InStrRev,它所做的正是您正在寻找的。
把这个放到一个新模块中:
Function RSearch(str As String, find As String)
RSearch = InStrRev(str, find)
End Function
你的函数看起来像这样(假设原始字符串在B1中):
=LEFT(B1,RSearch(B1,"\"))
新答案| 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"),))
推荐文章
- 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文件的正确内容类型是什么?