2017-05-31 17 views
2

ArrayFormulaとFILTERの組み合わせを使用して、すべての検索語を含む列のすべてのセルを一覧表示しています。私のFILTERにTRUE/FALSEを返す他の基準があるので、私はQUERY/CONTAINS/LIKEではなくREGEXMATCHを使用しています。複数の単語に一致するすべての文字列セルを検索するRegexmatch

私の問題は優先順位のようです。したがって、次の正規表現は制限された方法で動作します。

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

ボブとネコを見つけますが、ボブがネコに先行する場合のみです。 ?

、Googleのシートは、私が先読みを使用しようとする場合、私は使用したくない

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

すなわち=失敗しました「|」入力語と同じ文字列(繰り返しと逆)の交替は2つ以上あるので、交互に指数関数的に複雑になります。

ここ...テスト検索アレイ(各行は、文字列を含む単一のセルである)です

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)\ bcat \ b')正規表現を使用すると、 )) ')。 –

答えて

2

2列

てみて下さい:フィルターは、配列数式そのものであるので、あなたはArrayFormulaを使用する必要はありません

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

を。

  • (?i) -
  • bob.*cat|cat.*bob
  • 検索する場合は、小文字を区別しないようにする - マッチ "ボブ→猫" や "猫→ボブ"

複数の文字列に

を探すより複雑な式があります一致する単語が2つ多くなるようにします。

リストがあるとします

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 

、列Cに入れ、3つのワードのすべての一致を検索する必要があります:A列に

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)は、 fはリスト内の単語の数と一致します。

結果は次のとおりです。

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

一見すると、「複数の文字列」は完璧なソリューションのように見えます。マックスありがとうございました。私はそれを実際の仕事にどのように組み込むことができるかを完全に理解するために、ここで少し時間を費やす必要があります。いずれにしても、私はあなたに「ベストアンサー」を予告しました。 – 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には、単語間にスペースを入れて入力します(cat Bob)。

すべての単語が小文字に変更されています。インデックス分割はC2の単語を区切り、別々の単語は正規表現内に入ります。以下は私の共有テストスプレッドシートです:Maxの非常に良い答えを拡張し

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

、これは、列Cの単語のリストのための計算式を変更します私は、共有スプレッドシート(​​シート2)に例を追加しました。

=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

関連する問題