我使用ArrayFormula和FILTER组合来列出列中包含所有搜索词的所有单元格。我使用REGEXMATCH而不是查询/包含/LIKE,因为我的过滤器有其他返回TRUE/FALSE的条件。
我的问题似乎是优先权。所以下面的正则表达式以一种有限的方式工作。
=ArrayFormula(filter(A1:A5,regexmatch(A1:A5,"(?i)^"&"(.*?\bbob\b)(.*?\bcat\b)"&".*$")))它将找到Bob和cat,但前提是Bob在cat之前。
如果我尝试使用lookahead ?= ie,Google sheets将失败
=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‘。我想我可以将这个输入字符串解压成单独的单词,然后连接到上面的表达式中,但是,如果有一种“最佳实践”的方法,我想听到的是。
发布于 2017-06-01 13:53:54
查找2个字符串
尝试:
=FILTER(A:A,REGEXMATCH(A:A,"(?i)bob.*cat|cat.*bob"))
您不需要使用ArrayFormula,因为filter本身就是数组公式。
(?i) -要使搜索大小写insensitivebob.*cat|cat.*bob -匹配"bob→cat“或”cat→bob“
查找多个字符串
有比2更复杂的公式来匹配更多的单词。
假设我们在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发布于 2017-06-01 05:18:41
看看这是否做了您想要的。在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中的单词分开,单独的单词进入正则表达式匹配。下面是我的共享测试电子表格:
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 ) )))发布于 2021-05-28 23:13:34
也许更容易理解(我讨厌MMULT)
=query({A1:A},"select Col1 where "&join(“and ",arrayformula("Col1 matches '."&filter(B:B,B:B<>”“)&”.‘“))
其中A包含您的短语列表,B包含您的标准单词。
公式的这一部分,=join(“and ",数组公式(”Col1 matches '."&filter(D3:D,D3:D<>"")&".'"))从B中的术语构建查询字符串。例如:
Col1与‘.cats’匹配。并且Col1与‘.dogs’匹配。
然后这个列表被连接到整个"select“表达式中:
选择Col1,其中Col1与‘.cats’匹配。并且Col1与‘.dogs’匹配。
https://stackoverflow.com/questions/44292991
复制相似问题