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

时间:2008-12-08 17:34:10

标签: excel excel-formula

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

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

示例:

  Are you classified as human? -> human?
Negative, I am a meat popsicle -> popsicle
                  Aziz! Light! -> Light!

15 个答案:

答案 0 :(得分:195)

这个经过测试并且确实有效(基于Brad的原始帖子):

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

如果原始字符串可能包含管道“|”字符,然后将上面的两个字符替换为源中不会出现的其他字符。 (我怀疑Brad的原文被破坏了,因为在翻译中删除了一个不可打印的字符。)

奖金:它如何运作(从右到左):

LEN(A1)-LEN(SUBSTITUTE(A1," ","")) - 原始字符串中的空格数
SUBSTITUTE(A1," ","|", ... ) - 使用|替换最终空间 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,"* *")语法。

当原始字符串在最后一个位置包含空格时,在计算所有空格时添加一个trim函数:使函数如下:

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

答案 1 :(得分:77)

这是我用过的非常成功的技术:

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

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

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

此外,用包含文本的单元格替换A1。

答案 2 :(得分:19)

杰瑞答案的更强大版本:

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

无论字符串的长度,前导或尾随空格,还是其他任何内容,它都可以正常工作,而且它仍然非常简短。

答案 3 :(得分:12)

我在Google上找到了this,在Excel 2003和Excel中进行了测试它对我有用:

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

答案 4 :(得分:2)

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

答案 5 :(得分: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)))}

答案 6 :(得分:2)

=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)作为分隔符而不是垂直条“| “以防这是一个理想的文本项目。

答案 7 :(得分:2)

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

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

在A1中使用'我的小猫'会导致'我的小'(Joe和Jerry会给'猫'

就像Jerry和Joe隔离最后一个单词一样,然后只需要将其左侧的所有内容(然后将其修剪回来)

答案 8 :(得分:1)

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

"My little cat" (1)

你使用

"tac elttil yM" (2)

在A2中=LEFT(A1;FIND(" ";A1)-1),{(1)}为(1),"My"为(2),后者为"tac",是(1)中的最后一个词。

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

如上所述安装上述内容。然后使用A1中的字符串,例如"cat",并在A2中使用此函数:

"My little cat"

您将在A2中看到=ReverseString(LEFT(ReverseString(A1);IF(ISERROR(FIND(" ";A1)); LEN(A1);(FIND(" ";ReverseString(A1))-1))))

上述方法假定单词由空格分隔。 "cat"子句用于包含单个单词的单元格=单元格中没有空格。注意:IFTRIM原始字符串也很有用。原则上,它从A1反转整个字符串,并简单地找到反向字符串中的第一个空白,该字符串位于最后一个(反向)单词旁边(即CLEAN)。 "tac "选择这个单词,另一个字符串反转重新构成单词的原始顺序(LEFT)。 " cat"语句末尾的-1会删除空白。

这个想法是,用FINDLEFT第一个空白提取字符串中的第一个(!)单词很容易。但是,对于最后一个(!)单词,当您尝试执行此操作时,FIND函数是错误的选择,因为很遗憾,FIND没有您想要分析字符串的方向的标记。

因此整个字符串只是颠倒了。 RIGHTLEFT正常工作但提取的字符串相反。但是一旦你知道如何扭转一个字符串,他就没什么大不了的了。公式中的第一个FIND语句可以完成这项工作。

答案 9 :(得分:1)

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

答案 10 :(得分: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,"\",""))))))

答案 11 :(得分: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)))))

enter image description here

答案 12 :(得分:0)

复制到列中,选择该列,然后选择HOME>编辑>找到&选择,替换:

Find what:

全部替换

星号后面有一个空格。

答案 13 :(得分:0)

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

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

答案 14 :(得分:-1)

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

  1. 反转字符串(“字符串1”变为“eno gnirts”)。
  2. 使用旧的Find(从左到右硬编码)。
  3. 再次将其反转为可读字符串。
  4. 这听起来怎么样?