我有一组术语和一组字符串,这些字符串可能包含也可能不包含其中一个或多个术语。我想搜索是否有一个或多个术语的匹配项。
搜索词(A1:A17
以下示例中的单元格)
* bob
* linda
* sam
搜索字符串(E
下例中的列)
* I'm sam
* I'm lucy
* Please find sam or bob or lucy
目前我正在使用一个OR
嵌套了一堆搜索函数的函数。例如:
=IF(OR(ISNUMBER(SEARCH(A$2,E33)),ISNUMBER(SEARCH(A$3,E33)),....,ISNUMBER(SEARCH(A$17,E33))),1,0)
我更喜欢使用相当于 SQL 的子字符串 IN (1,2,3,4) 的某种方式
答案1
好了,您了解了如何在字符串中搜索单词:
SEARCH(A$2, E1)
A2
在 中搜索(“bob”)的值E1
(可能类似于“I'm sam”)。这将返回#VALUE
,因为“bob”未出现在“I'm sam”中。但是,
SEARCH("sam", "I'm sam")
返回5
,因为“sam”出现在“I'm sam”中,从第 5 个字符开始。
您要求使用技巧来将其扩展到大量搜索字符串。技巧是使用数组公式。数组公式看起来有点像这样:
=SEARCH(A$2:A$17, E1)
搜索E1
每个中的值A2:A17
,创建一个包含 16 个结果的数组。对于示例数据,这些结果看起来像 { #VALUE
; #VALUE
; 5
; … }。
请参阅此答案底部的重要说明。
您不能单独使用它,因为单元格需要计算出一个值,而不是数组。但您可以这样做
=COUNT(SEARCH(A$2:A$17, E1))
计算结果中的数字SEARCH
——即它告诉多少的A
单词(“bob”、“linda”、“sam”等)出现在 中E1
。因此,您的
=IF( OR(ISNUMBER(SEARCH(A$2,E1)),…,ISNUMBER(SEARCH(A$17,E1))), 1, 0)
公式(1
如果至少找到一个单词,0
否则)可以替换为
=IF(COUNT(SEARCH(A$2:A$17, E1))>0, 1, 0)
或者简单地
=--(COUNT(SEARCH(A$2:A$17, $E1))>0)
(在/值--
前面放置(双减) 分别将其变成或。)TRUE
FALSE
1
0
但你可能想做的不仅仅是确定无论其中一个字符串匹配;你可能想知道哪个一。好吧,还记得我说过
SEARCH(A$2:A$17, E1)
对数组 { #VALUE
; #VALUE
; 5
; … } 求值吗?让我们5
从中提取:
=MIN(IFERROR(SEARCH(A$2:A$17, $E1), ""))
ISERROR
有点类似,ISNUMBER
只是反过来而已;TRUE
如果参数是错误值则返回,FALSE
如果是正常值(数字、布尔值、日期或字符串),则返回。IFERROR
是一个非常方便的功能;如果错误(计算值,默认值)
是缩写
如果(IS错误(计算值),默认值,计算值)
即,它替换默认值(通常是非-错误值)表示错误值。
- 因此
IFERROR(SEARCH(A$2:A$17, $E1), "")
将上述数组结果更改为 {""
;""
;5
; … }。 - 然后从数组中提取最小数字,跳过空字符串。通常这将是
MIN( the_above )
仅有的数字,除非在“请查找 sam 或 bob 或 lucy”等有多个匹配项的情况下。在这些情况下,它将是字符串中的第一个匹配项E
(此处为13
,其中出现“sam”)。
那么,现在就行动吧
=MATCH(MIN(IFERROR(SEARCH(A$2:A$17, E1), "")), SEARCH(A$2:A$17,E1))
此 ( ) 会在完整搜索结果中MATCH
查找5
(or or whatever),以查看其出现的位置。在上面的示例中,此操作返回,因为(or or whatever) 是搜索结果中的第三个元素 - 因为它对应于“sam”,这是第三个搜索词。13
3
5
13
如下图所示,
F1
(匹配数) ==COUNT(SEARCH(A$2:A$17, E1))
G1
(第一个匹配的位置)==MIN(IFERROR(SEARCH(A$2:A$17, E1), FALSE))
H1
(第一个匹配的索引 (字符串编号)) =
=MATCH(MIN(IFERROR(SEARCH(A$2:A$17, E1), "")), SEARCH(A$2:A$17,E1))
重要笔记:
- 输入数组公式(即上述任何公式)时,请输入Ctrl+ Shift+ Enter。这样公式就会出现在花括号中。不要手动输入花括号。
- 上述公式假设您要搜索的数据(“我是 sam”等)从单元格开始
E1
。根据需要进行调整。输入与数据第一行对应的公式并向下拖动。 - 避免在中出现空白单元格
A2:A17
,因为SEARCH
会在每个字符串中找到空字符串。