2017-05-31 82 views
2

我正在使用ArrayFormula和FILTER組合來列出包含所有搜索字詞的列中的所有單元格。我使用的是REGEXMATCH而不是QUERY/CONTAINS/LIKE,因爲我的FILTER有其他條件返回TRUE/FALSE。Regexmatch查找匹配多個單詞的所有字符串單元

我的問題似乎是優先。所以下面的正則表達式以有限的方式工作。

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

它會找到鮑勃和貓,但只有當鮑勃先於貓。如果我嘗試使用前瞻

谷歌牀單失敗=即

=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 

一次,我已經在正則表達式整理出來,最終的解決方案將是用戶輸入的文本框,他們只是輸入必須在一個字符串即「鮑勃貓」,可以找到的話。這個輸入字符串,我想我可以解開它的單獨的單詞,並連接到上述表達式,但是,如果有這樣做的'最佳實踐'的方式,我想聽聽。

+1

RE2引擎不支持,可以檢查的模式,而無需耗費文本向前看符號。因此,唯一的解決方法是使用幾個匹配函數:'和(regexmatch(A1:A5,'(?i)\ bBob \ b'),regexmatch(A1:A5,'(?i)\ bcat \ b' ))'。 –

回答

2

找到2串

嘗試:

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

你並不需要使用ArrayFormula因爲過濾器是數組公式本身。

  • (?i) - 使搜索不區分大小寫
  • 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))

它使用RegexMatch轉置清單C1:C3,然後mmult功能總和匹配和=COUNTA(C1:C3)比較數字o f與列表中的單詞數相匹配。

結果是:

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

一見鍾情'多串'看起來像是完美的解決方案。非常感謝Max。我現在需要花一些時間來充分理解如何將其整合到實際任務中。無論哪種方式,我已經給你預期的'最佳答案'。 – DeeKay789

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中的單詞分開,並將單獨的單詞放入正則表達式中。下面是我共享的測試表格:

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

擴展上最大的很好的答案,這將改變公式我添加了一個例子來共享電子表格(Sheet2中)在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)))) 
+0

和@Wiktor都回答了給定數據的工作,所以thx爲此。我必須解析並拆分數據,以便您的答案具有足夠的靈活性,以便在更大的計劃中使用。那麼,''COUNTA(SPLIT(C2,「」))是一種有效的方法來提供每個「條件」實例之前的狀態? – DeeKay789

相關問題