如何在不使用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,TRIMSUBSTITUTE为一般情况下的单字符解决方案添加第二个字符之后,您不需要该函数。该公式消除了该部分,从而提供了预期的结果:=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子句适用于包含单个单词的单元格=单元格中无空格。注意:TRIMCLEAN原始字符串也很有用。原则上,它从A1反转整个字符串,并简单地在反转字符串中找到最后一个(反转)单词(即"tac ")旁边的第一个空格。LEFT选择该单词,然后另一个字符串反转构成单词(" cat")的原始顺序。将-1在年底FIND语句删除空白。

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

因此,整个字符串被简单地颠倒了。LEFTFIND正常工作,但提取的字符串反转了。但是,一旦您知道如何反转字符串,他就没什么大不了的了。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.