Regexmatch查找匹配多个单词

时间:2017-05-31 19:13:41

标签: regex google-sheets

我使用ArrayFormula和FILTER组合列出包含所有搜索字词的列中的所有单元格。我使用REGEXMATCH而不是QUERY / CONTAINS / LIKE因为我的FILTER有其他标准返回TRUE / FALSE。

我的问题似乎优先。因此,以下正则表达式以有限的方式工作。

=ArrayFormula(filter(A1:A5,regexmatch(A1:A5,"(?i)^"&"(.*?\bbob\b)(.*?\bcat\b)"&".*$")))

它会找到鲍勃和猫,但只有当Bob先于猫。

如果我尝试使用lookahead,Google表单会失败吗?= ie

=ArrayFormula(filter(A1:A5,regexmatch(A1:A5,"(?i)^"&"(?=.*?\bbob\b)(?=.*?\bcat\b)"&".*$")))

我不想使用' |'字符串中的交替(重复和反向),因为输入字可能多于两个,因此交替变得指数地更复杂。

这是测试搜索数组(每行是包含字符串的单个单元格)...

Bob ate the dead cat
The cat ate live bob
No cat ate live dog
Bob is dead
Bob and the cat are alive

......以及之后我想要的结果。

Bob ate the dead cat
The cat ate live bob
Bob and the cat are alive

一旦我对正则表达式进行了整理,最终解决方案将是一个用户输入文本框,他们只需输入必须在字符串中找到的单词,即“Bob cat'”。这个输入字符串我认为我可以解压缩成单独的单词并连接到上面的表达式,但是,如果有一个最佳实践'这样做的方式我想听。

3 个答案:

答案 0 :(得分:2)

查找2个字符串

尝试:

=FILTER(A:A,REGEXMATCH(A:A,"(?i)bob.*cat|cat.*bob"))

您不需要使用ArrayFormula,因为过滤器是数组公式本身。

  • (?i) - 使搜索不区分大小写
  • bob.*cat|cat.*bob - 匹配“bob→cat”或“cat→bob”

查找多个字符串

还有更复杂的公式,可以匹配更多的单词。

假设我们在A列中有一个列表:

Bob ate the dead cat
The cat ate live bob
No cat ate live dog
Bob is dead
Bob and the cat are alive
Cat is Bob
ate Cat bob

需要查找3个单词的所有匹配项,将它们放在C列中:

cat
ate
bob

公式为:

=FILTER(A:A,MMULT(--REGEXMATCH(A:A, "(?i)"&TRANSPOSE(C1:C3)),ROW(INDIRECT("a1:a"&COUNTA(C1:C3)))^0)=COUNTA(C1:C3))

它使用RegexMatch转换后的单词C1:C3,然后mmult函数和匹配,=COUNTA(C1:C3)将匹配数与列表中的单词数进行比较。

结果是:

Bob ate the dead cat
The cat ate live bob
ate Cat bob

答案 1 :(得分:0)

看看这是否符合您的要求。在B1输入:

=arrayformula(filter(A1:A5,regexmatch(A1:A5,lower(index(split(C2," "),0,1)))*regexmatch(lower(A1:A5),lower(index(split(C2," "),0,2)))))

在C2中输入您的搜索词,它们之间有空格(猫鲍勃)。

所有单词都改为小写。索引拆分分隔C2中的单词,单独的单词进入regexmatch。以下是我的共享测试电子表格:

https://docs.google.com/spreadsheets/d/1sDNnSeqHbi0vLosxhyr8t8KXa3MzWC_WJ26eSVNnG80/edit?usp=sharing

扩展Max的非常好的答案,这将更改C列中单词列表的公式。我在共享电子表格(Sheet2)中添加了一个示例。

=FILTER(A:A,MMULT(--REGEXMATCH(A:A,"(?i)"&TRANSPOSE(INDIRECT( "C1:C" & counta(C1:C ) ))),ROW(INDIRECT("a1:a"&COUNTA(INDIRECT( "C1:C" & counta(C1:C ) ))))^0)=COUNTA(INDIRECT( "C1:C" & counta(C1:C ) )))

答案 2 :(得分:0)

也许更容易理解(我讨厌MMULT)

=query({A1:A},"select Col1 where "&join(" and ",arrayformula("Col1 匹配 '."&filter(B:B,B:B<>"")&" .'")))

其中 A 包含您的短语列表,B 包含您的标准词。

这部分公式,=join(" and ",arrayformula("Col1 匹配 '."&filter(D3:D,D3:D<>"")&".'" )) 根据 B 中的术语构建查询字符串。例如:

Col1 匹配“.cats.”,Col1 匹配“.dogs.

然后这个列表被连接成整个“选择”表达式:

选择 Col1,其中 Col1 匹配 '.cats.' 并且 Col1 匹配 '.dogs.'