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


当前回答

我来晚了一点,但也许这个能帮上忙。问题中的链接使用了类似的公式,但我的链接使用IF()语句来消除错误。

如果你不怕Ctrl+Shift+Enter,你可以很好地使用数组公式。

字符串(在单元格A1中): “one.two.three.four”

公式:

{=MAX(IF(MID(A1,ROW($1:$99),1)=".",ROW($1:$99)))}  use Ctrl+Shift+Enter

结果:14

首先,

ROW($1:$99)

返回1到99的整数数组:{1,2,3,4,…,98,99}。

接下来,

MID(A1,ROW($1:$99),1)

返回一个在目标字符串中找到的长度为1的字符串数组,然后在达到目标字符串的长度后返回空白字符串:{"o","n","e",".",…"u","r","","",""…}

接下来,

IF(MID(I16,ROW($1:$99),1)=".",ROW($1:$99))

将数组中的每个项与字符串"."进行比较,并返回字符串中字符的索引或FALSE: {FALSE,FALSE,FALSE,4,FALSE,FALSE,FALSE,8,FALSE,FALSE,FALSE,FALSE,FALSE, FALSE,14,FALSE,FALSE.....}

最后的

=MAX(IF(MID(I16,ROW($1:$99),1)=".",ROW($1:$99)))

返回数组的最大值:14

这个公式的优点是简短,相对容易理解,并且不需要任何唯一的字符。

缺点是需要使用Ctrl+Shift+Enter和字符串长度的限制。这可以通过如下所示的变化来解决,但该变化使用OFFSET()函数,这是一个volatile(读取:slow)函数。

不知道这个公式的速度是多少。

变化:

=MAX((MID(A1,ROW(OFFSET($A$1,,,LEN(A1))),1)=".")*ROW(OFFSET($A$1,,,LEN(A1)))) works the same way, but you don't have to worry about the length of the string

=SMALL(IF(MID(A1,ROW($1:$99),1)=".",ROW($1:$99)),2) determines the 2nd occurrence of the match

=LARGE(IF(MID(A1,ROW($1:$99),1)=".",ROW($1:$99)),2) determines the 2nd-to-last occurrence of the match

=MAX(IF(MID(I16,ROW($1:$99),2)=".t",ROW($1:$99))) matches a 2-character string **Make sure you change the last argument of the MID() function to the number of characters in the string you wish to match!

其他回答

我来晚了一点,但也许这个能帮上忙。问题中的链接使用了类似的公式,但我的链接使用IF()语句来消除错误。

如果你不怕Ctrl+Shift+Enter,你可以很好地使用数组公式。

字符串(在单元格A1中): “one.two.three.four”

公式:

{=MAX(IF(MID(A1,ROW($1:$99),1)=".",ROW($1:$99)))}  use Ctrl+Shift+Enter

结果:14

首先,

ROW($1:$99)

返回1到99的整数数组:{1,2,3,4,…,98,99}。

接下来,

MID(A1,ROW($1:$99),1)

返回一个在目标字符串中找到的长度为1的字符串数组,然后在达到目标字符串的长度后返回空白字符串:{"o","n","e",".",…"u","r","","",""…}

接下来,

IF(MID(I16,ROW($1:$99),1)=".",ROW($1:$99))

将数组中的每个项与字符串"."进行比较,并返回字符串中字符的索引或FALSE: {FALSE,FALSE,FALSE,4,FALSE,FALSE,FALSE,8,FALSE,FALSE,FALSE,FALSE,FALSE, FALSE,14,FALSE,FALSE.....}

最后的

=MAX(IF(MID(I16,ROW($1:$99),1)=".",ROW($1:$99)))

返回数组的最大值:14

这个公式的优点是简短,相对容易理解,并且不需要任何唯一的字符。

缺点是需要使用Ctrl+Shift+Enter和字符串长度的限制。这可以通过如下所示的变化来解决,但该变化使用OFFSET()函数,这是一个volatile(读取:slow)函数。

不知道这个公式的速度是多少。

变化:

=MAX((MID(A1,ROW(OFFSET($A$1,,,LEN(A1))),1)=".")*ROW(OFFSET($A$1,,,LEN(A1)))) works the same way, but you don't have to worry about the length of the string

=SMALL(IF(MID(A1,ROW($1:$99),1)=".",ROW($1:$99)),2) determines the 2nd occurrence of the match

=LARGE(IF(MID(A1,ROW($1:$99),1)=".",ROW($1:$99)),2) determines the 2nd-to-last occurrence of the match

=MAX(IF(MID(I16,ROW($1:$99),2)=".t",ROW($1:$99))) matches a 2-character string **Make sure you change the last argument of the MID() function to the number of characters in the string you wish to match!

刚想出这个解决方案,不需要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"

希望这对你有帮助。

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

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

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

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

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

对于A1中的字符串和B1中的子字符串,使用:

= XMATCH (B1,中期(A1,序列(LEN (A1)), LEN (B1)),, 1)

从内到外,MID(A1,SEQUENCE(LEN(A1)),LEN(B1))将字符串A1拆分为一个动态的子字符串数组,每个子字符串的长度为B1。为了找到子字符串B1最后出现的位置,我们使用XMATCH并将其Search_mode参数设置为-1。

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

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