[英]How can I perform a reverse string search in Excel without using VBA?
我有一个包含字符串列表的Excel电子表格。 每个字符串由几个单词组成,但每个字符串中的单词数不同。
使用内置的Excel函数(无VBA),有没有办法隔离每个字符串中的最后一个单词?
例子:
Are you classified as human? -> human? Negative, I am a meat popsicle -> popsicle Aziz! Light! -> Light!
这个测试并且确实有效(基于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," ",""))))))
这是我用过的非常成功的技术:
=TRIM(RIGHT(SUBSTITUTE(A1, " ", REPT(" ", 100)), 100))
要获取字符串中的第一个单词,只需从RIGHT更改为LEFT
=TRIM(LEFT(SUBSTITUTE(A1, " ", REPT(" ", 100)), 100))
另外,用包含文本的单元格替换A1。
Jerry的答案更强大的版本:
=TRIM(RIGHT(SUBSTITUTE(TRIM(A1), " ", REPT(" ", LEN(TRIM(A1)))), LEN(TRIM(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的答案也不适用于尾随空格或空单元格...
[第二次编辑]实际上,它对单个单词也不起作用......
要添加到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隔离最后一个单词一样,这样就可以获得左边的所有内容(然后将其修剪掉)
=RIGHT(A1,LEN(A1)-FIND("`*`",SUBSTITUTE(A1," ","`*`",LEN(A1)-LEN(SUBSTITUTE(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)))}
=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)作为分隔符而不是垂直条“|” 以防这是一个理想的文本项目。
=LEFT(A1,FIND(IF(
ISERROR(
FIND("_",A1)
),A1,RIGHT(A1,
LEN(A1)-FIND("~",
SUBSTITUTE(A1,"_","~",
LEN(A1)-LEN(SUBSTITUTE(A1,"_",""))
)
)
)
),A1,1)-2)
想象一下,字符串可以颠倒过来。 那真的很容易。 而不是在字符串上工作:
"My little cat" (1)
你工作
"tac elttil yM" (2)
在=LEFT(A1;FIND(" ";A1)-1)
使用=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
子句适用于包含单个单词的单元格=单元格中没有空白。 注意: TRIM
和CLEAN
原始字符串也很有用。 原则上,它从A1反转整个字符串,并简单地找到反向字符串中的第一个空白,该字符串位于最后一个(反向)单词旁边(即"tac "
)。 LEFT
选择这个单词,另一个字符串反转重新构成单词的原始顺序( " cat"
)。 FIND
语句末尾的-1
删除空白。
我们的想法是,它很容易提取的第一个(!),字与字符串LEFT
和FIND
荷兰国际集团的第一个空白。 但是,对于最后一个(!)单词,当您尝试执行此操作时, RIGHT
函数是错误的选择,因为遗憾的是,FIND没有标记您想要分析字符串的方向。
因此,整个字符串只是颠倒了。 LEFT
和FIND
正常工作但提取的字符串相反。 但是一旦你知道如何扭转一个字符串,他就没什么大不了的了。 公式中的第一个ReverseString
语句执行此任务。
我翻译成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,"\",""))))))
我也有这样的任务,当我完成后,使用上面的方法,一个新的方法发生在我身上:你为什么不这样做:
这听起来怎么样?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.