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


165

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

使用内置的Excel函数(无VBA),是否可以隔离每个字符串中的最后一个单词?

例子:

  您被归类为人类吗?->人类?
负面的,我是肉冰棍->冰棍
                  阿齐兹!光!->轻!

4
我想知道为什么您有人为的无VBA约束?
— EBGreen

3
我可以使用VBA轻松解决它,但是我很好奇是否有非VBA解决方案。VBA往往会对大型数据集造成性能损失。
— e.James

像往常一样,两个答案确实很突出,我很难决定选择哪个作为正确答案。在这种情况下,Jon和BradC(在Brad的帮助下)都提出了正确的可行解决方案。
— e.James

我选择BradC的解决方案是因为这似乎是两者中比较优雅的一种,他为该功能提供了方便的解释。
— e.James

如果您没有指出是什么使VBA不合适,那么很难正确回答您的问题(因为您可以在VBA中编写自己的宏和函数,使其等同于内置函数)。
— dkretz 2011年

Answers:


208

该代码已经过测试并且可以正常工作(基于Brad的原始帖子):

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

如果您的原始字符串可能包含竖线“ |” 字符,然后用不会在您的源代码中出现的其他字符替换上面的两个字符。(我怀疑Brad的原件已损坏,因为在翻译中删除了无法打印的字符)。

奖励:工作原理(从右到左):

LEN(A1)-LEN(SUBSTITUTE(A1," ",""))–原始字符串中的空格计数
SUBSTITUTE(A1," ","|", ... )– 用a 替换最后一个空格|
FIND("|", ... )–查找被替换的绝对位置|(即最后一个空格)
Right(A1,LEN(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," ",""))))))

1
感激不尽。也需要字符串的其余部分,因此只需将= RIGHT更改为= LEFT并删除LEN(A1)-即可得到其余部分。但是感谢您完成了所有最初的工作:)
— Luke Duddridge 2010年

4
+1:我将必须记住“ LEN(A1)-LEN(SUBSTITUTE(A1,“”,“”))“技巧,以获取角色的实例数量
— anschauung 2011年

2
优秀的解决方案!唯一的问题是Excel会对函数名称进行本地化,因此您需要为非英语Excel重新编写公式。这是俄语版本的重写后的变体:=ПРАВСИМВ(A1;ДЛСТР(A1)-ПОИСК(“ |”;ПОДСТАВИТЬ(A1;“”;“ |”;ДЛСТР(A1)-ДЛСТР(ПОДСТАВИТЬ(A1; ““;”“))))))
— Michael Pliskin 2011年

该答案在包含连续空格的字符串上中断。
— somewhatsapient

1
我建议将公式分解为临时列(您可以稍后将其隐藏)。这对于调试特殊情况非常有用。
— 威斯巴基2014年

84

这是我成功使用的技术:

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

要获得字符串中的第一个单词,只需从RIGHT更改为LEFT

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

另外,将A1替换为包含文本的单元格。


2
适用于我-只是" "用我的分隔符替换了第一个。100如果我没记错的话,这两个S似乎会将其限制为100个字符的字符串
— Benjineer 2014年

1
如果我们使用其他定界符,我们也需要在最后将其删除,例如=TRIM(SUBSTITUTE(RIGHT(SUBSTITUTE(A1, ".", REPT(".", 100)), 100), ".", ""))
— dumbledad

7
很聪明的方法。它的作用是将每个空格替换为100个空格,然后返回最后100个字符而没有前导/尾随空格。
— Zenadix

@Benjineer我认为它适用于长度超过100个字符的字符串。100个字符限制单个单词的大小。您要使用右边(或左边)个字符.....如果一个单词长101个字符,您将遇到问题,但是如果一个字符串总共100个字符...带有3个空格...将填充到大约400个字符串仍然可以使用。感谢Jerry Beaucaire-非常优雅,谢谢。
— 锡范

22

杰里的答案的更强大的版本:

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

无论字符串的长度,前导或尾随空格或任何其他内容,该方法都有效,并且仍然非常简短。


2
这是一个很好的公式。我修改了公式=TRIM(RIGHT(SUBSTITUTE(TRIM(A1), ".", REPT(" ", LEN(TRIM(A1)))), LEN(TRIM(A1))))以获取文件扩展名。
— 阿达什·马德雷查

2
一项SUBSTITUTE允许它适用于任何字符,而不仅仅是空格。=TRIM(SUBSTITUTE(RIGHT(SUBSTITUTE(TRIM(A1),"/",REPT("/",LEN(TRIM(A1)))),LEN(TRIM(A1))),"/","")),其中“ /”是定界字符。
— PProteus

@Joefinkle,这是一个非常简洁和聪明的解决方案。它工作得很好,只是要提一下,如果定界符是字符串,那么在所有情况下都无法正常工作,这里是一个" ; "有输入值的定界符示例:(由空格包围的分号):"Technology Sprint 24 ; Sprint 4"它返回:"; Sprint 4"。我正在使用由@PProteus改编的解决方案。
— David Leal

如果定界符是字符串,则可能的解决方法是先用一些特殊字符替换它,例如在@PProteus公式中替换TRIM(A1)为:TRIM(SUBSTITUTE(A1, "strDelimeter", ";"))在所有位置,以拥有新的字符定界符: ";"或者甚至更好地使用char()函数查找一些真正意想不到的角色。
— David Leal

1
@PProteus,TRIM在SUBSTITUTE为一般情况下的单字符解决方案添加第二个字符之后,您不需要该函数。该公式消除了该部分,从而提供了预期的结果:=SUBSTITUTE(RIGHT(SUBSTITUTE(TRIM(A1),";",REPT(";",LEN(TRIM(A1)))),LEN(TRIM(A1))),";","")
— David Leal

13

我在Google上找到了此文件,并在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的答案也不适用于尾随空格或空单元格...
[第二次编辑]实际上,它不适用于一个字要么...


最近的解决方案,但是我会抛出Trim(),因为尾随空格会破坏它。
— EBGreen

没错,可能最容易在中间单元格中进行trim(),然后将上述公式应用于中间单元格。另外,吐出0,如果细胞恰好是空的,所以也可以与ISBLANK()包裹
— 乔恩

3
=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)用作分隔符,而不是竖线“ |” 以防万一这是所需的文本项。


在excel 2010中为我工作。谢谢
— Rudiger Wolf

2

这是非常干净和紧凑的,并且效果很好。

{=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)))}

凉。数组函数的使用真的很有趣!没想到这么长时间后我再也没有得到答案。感谢你的分享。
— e.James

2
=RIGHT(A1,LEN(A1)-FIND("`*`",SUBSTITUTE(A1," ","`*`",LEN(A1)-LEN(SUBSTITUTE(A1," ",""))))) 

你测试了吗?不适用于“您被归类为人类吗?”
— Ed Guiness,

不,它不起作用。有一些有趣的元素。LEN(A1)-LEN(SUBSTITUTE(A1,””, “”)让你的空间计数的的字符串中。
— BradC

这是一个有趣的功能。太糟糕了,它不起作用。我喜欢能够计算空格数的技巧。
— e.James

@Brad:我编辑了您的帖子以显示*字符。原稿无法正确打印。有了这些,它就可以工作。+1
— e.James

2

要添加到Jerry和Joe的答案中,如果您想在最后一个单词之前找到文本,可以使用:

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

在A1中使用“我的小猫”会得到“我的小猫”(乔和杰里的人会给“猫”

与Jerry和Joe隔离最后一个单词的方式相同,然后将所有内容都放在该单词的左侧(然后将其修剪掉)


1

想象一下,字符串可以颠倒。那真的很容易。而不是处理字符串:

"My little cat" (1)

你一起工作

"tac elttil yM" (2)

随着=LEFT(A1;FIND(" ";A1)-1)在A2你"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))))

你会看到的 "cat"在A2中。

上面的方法假定单词由空格分隔。该IF子句适用于包含单个单词的单元格=单元格中无空格。注意:TRIM和CLEAN原始字符串也很有用。原则上,它从A1反转整个字符串,并简单地在反转字符串中找到最后一个(反转)单词(即"tac ")旁边的第一个空格。LEFT选择该单词,然后另一个字符串反转构成单词(" cat")的原始顺序。将-1在年底FIND语句删除空白。

这个想法是很容易提取与字符串中的第(!)字LEFT和FIND荷兰国际集团的第一个空白。但是,对于last(!)单词,RIGHT尝试执行此功能时选择的函数是错误的,因为不幸的是FIND没有要分析字符串的方向的标志。

因此,整个字符串被简单地颠倒了。LEFT并FIND正常工作,但提取的字符串反转了。但是,一旦您知道如何反转字符串,他就没什么大不了的了。ReverseString公式中的第一条语句完成了这项工作。


这比这里的所有其他选项要简单得多,非常感谢!为什么“查找”无法进行反向查找或替代-我似乎记得与使用负数进行反向搜索有关的事情,但显然不是vba ....
— Craig Lambie

3
OP要求不提供VBA。
— Tripp Kinetics

也就是疯了!如果您要使用VBA,则可以很容易地找到一个逆向搜索
— Denzil Newman

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

1

复制到列中,选择该列,然后选择主页>编辑>查找并选择,替换:

找什么:

Replace All。

星号后有一个空格。


需要注意的是*是在Excel搜索一(贪婪)通配符,所以这次比赛的一切,直到最后的空间和替换它什么也没有
— Superfly的乔恩

0

我也将其翻译为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,"\",""))))))

3
我不知道如何用葡萄牙语阅读Excel,所以我必须对你说的话:)
— e.James

0

实现此目的的另一种方法如下

=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)))))

在此处输入图片说明


-1

我也有这样的任务,完成后,使用上述方法,我想到了一个新方法:为什么不这样做:

  1. 反转字符串(“字符串一”变为“ eno gnirts”)。
  2. 使用良好的旧Find(从左到右进行硬编码)。
  3. 再次将其反转为可读字符串。

听起来如何?


12
当然。但是,如何在Excel中反转字符串?
— e.James,2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.