如何在不使用VBA的情况下在Excel中执行反向stringsearch?

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

使用内置的Excel函数(无VBA),是否有办法隔离每个string中的最后一个单词?

例子:

  你被归类为人类?  - >人类?
消极的,我是一个肉棒冰棍 - >冰棒
                  阿齐兹! 光!  - >轻! 

这一个被testing,并工作(基于布拉德原来的职位):

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

如果您的原始string可能包含pipe道“|” 字符,然后在上面replace一些其他字符,将不会出现在您的来源。 (我怀疑Brad的原文是因为翻译中删除了不可打印的字符而被破坏的)。

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

LEN(A1)-LEN(SUBSTITUTE(A1," ","")) – 计算原始string中的空格
SUBSTITUTE(A1," ","|", ... ) – 用|replace最后的空格
FIND("|", ... ) – 查找replace的绝对位置| (那是最后的空间)
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,"* *")语法。

当原始string可能在最后一个位置包含空格时,在计算所有空格时添加一个修剪函数:使函数如下所示:

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

这是我用过的很成功的技术:

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

要获取string中的第一个单词,只需从右侧切换到左侧

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

另外,用保存文本的单元格replaceA1。

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

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

不pipestring的长度,前导空格还是尾随空格,或者其他任何东西,它都可以工作,它仍然非常简短。

我发现这在谷歌上,在Excel 2003中testing,它适用于我:

 =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的答案也不适用尾随空格或空单元格…
[第二编辑]实际上,它不适用于单个单词…

想象一下这个string可以颠倒过来。 那真的很简单。 而不是在string上工作:

 "My little cat" (1) 

你一起工作

 "tac elttil yM" (2) 

在A2中你用(1)和(2)得到了"My"与(1)中的最后一个词是相反的"cat"

有几个VBAs来扭转一个string。 我更喜欢公共的VBA函数ReverseString

如上所述安装上述内容。 然后用A1中的string,例如"My little cat"和A2中的这个函数:

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

你会在A2看到"cat"

上面的方法假定单词由空格分开。 IF子句用于包含单个单词的单元格=单元格中没有空格。 注意: TRIMCLEAN原始string也很有用。 原则上,它将从A1反转整个string,并简单地find倒数字的最后一个(反转)字词(即"tac " )旁边的第一个空格。 LEFTselect这个单词,另一个string反转重新组成单词( " cat" )的原始顺序。 FIND语句末尾的-1删除空白。

这个想法是很容易用LEFT提取string中的第一个(!)单词并find第一个空格。 但是,对于最后一个(!)单词, RIGHT函数在您尝试这样做时是错误的select,因为不幸的是FIND没有用于分析string的方向的标志。

因此,整个string简单地颠倒过来。 LEFTFIND工作正常,但提取的string是相反的。 但是一旦你知道如何扭转一个string,他就没什么大不了的了。 公式中的第一个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)作为分隔符而不是垂直条“|” 以防万一这是一个理想的文本项目。

这是非常干净和紧凑,运作良好。

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

它没有错误陷阱没有空格或一个字,但很容易添加。

编辑:
这将处理尾随空格,单个单词和空单元格场景。 我没有find一个方法来打破它。

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

要添加到杰里和乔的答案,如果你想find的文字前最后一个字,你可以使用:

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

A1中的“我的小猫”会导致“我的小”(乔和杰里的“猫”

就像杰里和乔分离最后一个词一样,这只是把所有东西都放在那个左边(然后将其修剪)

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

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

(请注意,我已将空间更改为\因为我只需要pathstring的文件名。)

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

我也有这样的任务,当我完成了,使用上面的方法,一个新的方法发生在我身上:你为什么不这样做:

  1. 反转string(“string1”变成“eno gnirts”)。
  2. 使用旧的Find(从左到右硬编码)。
  3. 再次将其翻译成可读的string。

这听起来怎么样?

另一种实现方法如下

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

在这里输入图像描述

复制到列中,select该列,然后selectHOME> Editing> Find&Select,Replace:

找什么:

全部replace

星号后有一个空格。