如何在不使用 VBA 的情况下在 Excel 中执行反向字符串搜索?

我有一个包含字符串列表的 Excel 电子表格。每个字符串由几个单词组成,但每个字符串中的单词数不同。

使用内置的 Excel 函数(没有 VBA) ,有没有办法隔离每个字符串中的最后一个单词?

例子:

Are you classified as human? -> human?
Negative, I am a meat popsicle -> popsicle
Aziz! Light! -> Light!
452631 次浏览
=RIGHT(A1,LEN(A1)-FIND("`*`",SUBSTITUTE(A1," ","`*`",LEN(A1)-LEN(SUBSTITUTE(A1," ","")))))

我发现 这个在谷歌,测试在 Excel 2003 & 它为我工作:

=IF(COUNTIF(A1,"* *"),RIGHT(A1,LEN(A1)-LOOKUP(LEN(A1),FIND(" ",A1,ROW(INDEX($A:$A,1,1):INDEX($A:$A,LEN(A1),1))))),A1)

[编辑]我没有足够的名声来评论,所以这似乎是最好的地方... ... BradC 的答案也不适用于尾随空格或空格... ..。
[第二次编辑]实际上,它也不适用于单词... ..。

这个经过测试并且有效(基于 Brad 最初的帖子) :

=RIGHT(A1,LEN(A1)-FIND("|",SUBSTITUTE(A1," ","|",
LEN(A1)-LEN(SUBSTITUTE(A1," ","")))))

如果原始字符串可以包含管道“ |”字符,那么用源代码中不会出现的其他字符替换上述两个字符。(我怀疑布拉德的原作被破坏是因为翻译中删除了一个不能打印的字符)。

奖励: 它是如何工作的(从右到左) :

原始字符串中的空格计数
|代替 期末考试空间
查找替换的 |的绝对位置(这是最后一个空格)
返回该 |之后的所有字符

编辑: 考虑到源文本不包含空格的情况,在公式的开头添加以下内容:

=IF(ISERROR(FIND(" ",A1)),A1, ... )

现在制造整个公式:

=IF(ISERROR(FIND(" ",A1)),A1, RIGHT(A1,LEN(A1) - FIND("|",
SUBSTITUTE(A1," ","|",LEN(A1)-LEN(SUBSTITUTE(A1," ",""))))))

或者您可以使用其他版本的 =IF(COUNTIF(A1,"* *")语法。

当原始字符串可能在最后一个位置包含一个空格时,添加一个修剪函数,同时计算所有的空格:

=IF(ISERROR(FIND(" ",B2)),B2, RIGHT(B2,LEN(B2) - FIND("|",
SUBSTITUTE(B2," ","|",LEN(TRIM(B2))-LEN(SUBSTITUTE(B2," ",""))))))

我翻译成 PT-BR,因为我也需要这个。

(请注意,我已经将空间更改为 \,因为我只需要路径字符串的文件名。)

=SE(ÉERRO(PROCURAR("\",A1)),A1,DIREITA(A1,NÚM.CARACT(A1)-PROCURAR("|", SUBSTITUIR(A1,"\","|",NÚM.CARACT(A1)-NÚM.CARACT(SUBSTITUIR(A1,"\",""))))))

这是非常干净,紧凑,工程良好。

{=RIGHT(A1,LEN(A1)-MAX(IF(MID(A1,ROW(1:999),1)=" ",ROW(1:999),0)))}

它不会因为没有空格或一个单词而出现错误陷阱,但是这很容易添加。

编辑:
这将处理尾随空格、单词和空单元格场景。

{=RIGHT(TRIM(A1),LEN(TRIM(A1))-MAX(IF(MID(TRIM(A1),ROW($1:$999),1)=" ",ROW($1:$999),0)))}

假设字符串可以被反转,那么就真的很简单了,而不是在字符串上工作:

"My little cat" (1)

你的同事

"tac elttil yM" (2)

A2中的 =LEFT(A1;FIND(" ";A1)-1)得到 "My"和(1) ,"tac"和(2) ,"cat"和(1)中的最后一个单词相反。

有一些 VBA 可以逆转字符串。我更喜欢公共 VBA 函数 ReverseString

按照上面的描述安装,然后用 A1中的字符串,例如 "My little cat"和 A2中的这个函数:

=ReverseString(LEFT(ReverseString(A1);IF(ISERROR(FIND(" ";A1));
LEN(A1);(FIND(" ";ReverseString(A1))-1))))

你会在 A2中看到 "cat"

上面的方法假设单词由空格分隔。IF子句用于包含单个单词的单元格 = 单元格中没有空格。注意: TRIMCLEAN原始字符串也很有用。原则上,它将整个字符串从 A1逆转过来,只是在逆转的字符串中找到最后一个(逆转的)单词(即 "tac ")旁边的第一个空格。LEFT选择这个单词,然后另一个字符串反转重新构成这个单词的原始顺序(" cat")。FIND语句末尾的 -1删除空白。

这个想法是很容易提取第一个(!)字符串中的单词,第一个空格为 LEFTFIND。但是,最后一个(!) 单词 RIGHT函数是错误的选择,因为不幸的是 FIND 没有一个方向标志,您想要分析您的字符串。

因此,整个字符串被简单地反转。LEFTFIND正常工作,但是提取的字符串是相反的。但是一旦你知道如何反转一根绳子,他的就不是什么大问题了。公式中的第一个 ReverseString语句执行此任务。

=RIGHT(TRIM(A1),LEN(TRIM(A1))-FIND(CHAR(7),SUBSTITUTE(" "&TRIM(A1)," ",CHAR(7),
LEN(TRIM(A1))-LEN(SUBSTITUTE(" "&TRIM(A1)," ",""))+1))+1)

这是非常健壮的-它适用于没有空格的句子,前/后空格,多个空格,多个前/后空格... 我使用 char (7)作为分隔符,而不是垂直条“ |”,以防它是一个所需的文本项。

这是我曾经非常成功地使用过的技巧:

=TRIM(RIGHT(SUBSTITUTE(A1, " ", REPT(" ", 100)), 100))

要获取字符串中的第一个单词,只需将其从右更改为左

=TRIM(LEFT(SUBSTITUTE(A1, " ", REPT(" ", 100)), 100))

另外,将 A1替换为保存文本的单元格。

我也有一个这样的任务,当我完成后,使用上述方法,一个新的方法出现在我脑海中: 为什么你不这样做:

  1. 反转字符串(“ string one”变成“ eno gnirts”)。
  2. 使用老式的 Find (从左到右硬编码)。
  3. 再次将其反转为可读字符串。

听起来怎么样?

对于杰里的回答,有一个更加强有力的版本:

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

不管字符串的长度,前导空格或尾随空格,或其他什么都可以,它仍然非常简短。

为了补充 Jerry 和 Joe 的回答,如果你想在最后一个单词之前找到文本,你可以使用:

=TRIM(LEFT(SUBSTITUTE(TRIM(A1), " ", REPT(" ", LEN(TRIM(A1)))), LEN(SUBSTITUTE(TRIM(A1), " ", REPT(" ", LEN(TRIM(A1)))))-LEN(TRIM(A1))))

A1中的“ My little cat”会导致“ My little”(乔和杰瑞的结果是“ cat”)

和 Jerry 和 Joe 分离出最后一个单词的方法一样,这个方法只是把所有单词放到左边(然后再剪回去)

=LEFT(A1,FIND(IF(
ISERROR(
FIND("_",A1)
),A1,RIGHT(A1,
LEN(A1)-FIND("~",
SUBSTITUTE(A1,"_","~",
LEN(A1)-LEN(SUBSTITUTE(A1,"_",""))
)
)
)
),A1,1)-2)

实现这一目标的另一种方法如下所示

=IF(ISERROR(TRIM(MID(TRIM(D14),SEARCH("|",SUBSTITUTE(TRIM(D14)," ","|",LEN(TRIM(D14))-LEN(SUBSTITUTE(TRIM(D14)," ","")))),LEN(TRIM(D14))))),TRIM(D14),TRIM(MID(TRIM(D14),SEARCH("|",SUBSTITUTE(TRIM(D14)," ","|",LEN(TRIM(D14))-LEN(SUBSTITUTE(TRIM(D14)," ","")))),LEN(TRIM(D14)))))

enter image description here

复制到一个列,选择该列,主页 > 编辑 > 查找 & 选择,替换:

Find what:

替换所有

星号后面有个空格。

也可以通过反转字符串并找到第一个空格来实现

=MID(C3,2+LEN(C3)-SEARCH(" ",CONCAT(MID(C3,SEQUENCE(LEN(C3),,LEN(C3),-1),1))),LEN(A1))

  1. 把绳子反过来

CONCAT(MID(C3,SEQUENCE(LEN(C3),,LEN(C3),-1),1))

  1. 查找反向字符串中的第一个空格

SEARCH(" ",...

  1. 将在反向字符串中找到的空格的位置与字符串的长度相减,并返回该部分

=MID(C3,2+LEN(C3)-SEARCH...

新答案2022年9月28日

考虑到新的 Excel 功能: 发完短信(检查可用性) ,你可以通过一个简单的公式来实现它:

=TEXTAFTER(A1," ", -1)

sample excel