regexMatch找到匹配多个单词的所有字符串单元格



我正在使用arrayformula和过滤组合来列出包含所有搜索术语单词的列中的所有单元格。我使用的是regexmatch而不是查询/包含/喜欢,因为我的过滤器具有返回true/false的其他条件。

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

=ArrayFormula(filter(A1:A5,regexmatch(A1:A5,"(?i)^"&"(.*?bbobb)(.*?bcatb)"&".*$")))

它会找到鲍勃和猫,但前提是鲍勃先于猫

Google表如果我尝试使用LookAhead?= IE

=ArrayFormula(filter(A1:A5,regexmatch(A1:A5,"(?i)^"&"(?=.*?bbobb)(?=.*?bcatb)"&".*$")))

我不想使用'|'字符串中的交替(重复和反向(,因为输入单词可能超过两个,因此交替变成指数更复杂。

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

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

一旦我解决了以下方面的解决方案,最终解决方案将是一个用户输入文本框,它们只需输入必须在字符串即"鲍勃cat"中找到的单词。这个输入字符串我认为我可以将其单独的单词拆开并与上述表达式相连,但是,如果有一种"最佳实践"方法,我想听到。

查找2个字符串

尝试:

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

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

  • (?i)-使搜索案例不敏感
  • 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))

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

结果是:

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

查看是否做您想要的。在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中输入您的搜索单词,并在它们之间使用一个空间(Cat Bob(。

所有单词都更改为较低的情况。索引拆分将C2中的单词分开,而单独的单词则在RegexMatch中分开。以下是我共享的测试电子表格:

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

扩展Max的非常好的答案,这将改变C列中单词列表的公式

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

也许更容易理解(我讨厌mmult(

= query({{a1:a},; select col1 where where''join'join(&quot" and&quot",arrayformula('col1匹配'。b:b<&qut;";

a包含您的短语列表和B包含您的标准单词。

公式的这一部分,= join(" and; arrayformula(" col1匹配"。&&quot。'((从B中的术语构建一个查询字符串。

col1匹配'。 cats。'和col1匹配'。狗。'

然后,此列表被串联到整个"选择"中。表达式:

选择col1其中col1匹配'。 cats。'和col1匹配'。狗。''

最新更新