2009-08-21 14 views
4

入力から基本的なテキストマッチングを行っています。私は基本的な "AND"を実行する能力が必要です。 "ANY"では、入力をスペースで区切り、パイプ( "|")文字で各単語を結合しますが、いずれの単語にも一致する正規表現を見つける方法が見つかりませんでした。正規表現 "AND"

switch (searchOption) { 
    case "any": 
    inputArray = input.split(" "); 
    if (inputArray.length > 1) { input = inputArray.join("|"); } 
    text = input; 
    break; 
    case "all": 
    inputArray = input.split(" "); 
    ***[WHAT TO DO HERE?]*** 
    text = input; 
    break; 
    case "exact": 
    inputArray = new Array(input); 
    text = input; 
    break; 
} 

これは簡単であるようです。

+0

「すべての単語に一致する」という意味ですか? – wds

答えて

6

lookaheadを使用してください。これを試してみてください:

if(inputArray.length>1) rgx = "(?=.*" + inputArray.join(")(?=.*") + ").*"; 

あなたはすべて単語が表示されますが、彼らはどのような順序にことができる場合にのみ一致している必要があります

(?=.*dog)(?=.*cat)(?=.*mouse).* 

のようなものになってしまいます。

  • 犬はマウスを食べた猫を食べました。
  • マウスをイヌおよびネコによって食べた。
  • ほとんどの猫はマウスと犬が大好きです。

でもない

  • マウスで犬。
  • マウスのような猫と犬。それが動作

方法は、第一のサブ正規表現(続く任意の文字の任意の数)、現在のマッチポイントから正規表現エンジンスキャン(0).*dogを探しているということです。その正規表現の真偽を判断すると、マッチポイントをリセットして(0に戻し)、次の正規表現で続行します。だから、各単語がどこにあるかは関係ありません。すべての単語が見つかるだけです。

編集:@Justinは、私が上に追加した末尾.*を持っているはずだと指摘しました。それがなければ、text.match(regex)が機能しますが、regex.exec(text)は空の一致文字列を返します。末尾が.*の場合、一致する文字列が得られます。

+0

ニースのトリック、請求書。私は実際にjavascriptの正規表現が先読みをサポートしているとは思わなかった。 –

+0

パターンの最後に '。*'を付けてはいけませんか?したがって、完全なパターンは '(?=。* dog)(?=。* cat)(?=。*マウス)です。先読みには何か操作が必要です。 –

+0

@Justin - 興味深い。私はこれを 'text.match(regex)'でテストし、マッチが成功しましたが、 'regex.exec(text)'ではなく、空のマッチ文字列( '。*'が見つからない場合)を返します。私は答えを更新します。ありがとう。 –

3

は、単純なforループを実行し、すべての用語を検索し、このような何か:

var n = inputArray.length; 
if (n) { 
    for (var i=0; i<n; i++) { 
     if (/* inputArray[i] not in text */) { 
      break; 
     } 
    } 
    if (i != n) { 
     // not all terms were found 
    } 
} 
+0

しかし、この方法の論理から判断すると、webwireは 'text'変数で単一の正規表現を使うことを望んでいます。私はそれを行う方法を考えることはできません! – butterchicken

+0

それはすべての可能な順列を生成する必要があり、それは* n *!です。 – Gumbo

+0

これは私が最終的に(jQueryを使って)処理した方法です...もっと簡単な方法があるかもしれないと思っただけです。 – webwires

3

での問題「と」である:どのような組み合わせであなたは、単語をしたいですか?彼らはどんな順序で出現することができますか、またはそれらは与えられた順序でなければなりませんか?彼らは連続して出現することができますか、または間に他の言葉がありますか?

これらの決定は、どのような検索(検索)に大きく影響します。

「A B C」(連続して順番に)を検索する場合は、式は単に/A B C/です。完了!

あなたが「FOOのBバーC」を探しているなら、それはあなたが「B fooのfooというC」のために/A.*?B.*?C/

探しているかもしれない場合は、/A/のために3つの別々のテストをやったほうが良いと思います、/B//C/

1

私の正規表現の料理本には、条件付きでこれを行う可能性のある正規表現があります。しかし、それは非常に複雑なので、私はオプションを反復して現在最高の定格応答に行くだろう。とにかく、彼らの例を適応しようとしている私はそれがようなものになるだろうと思う:

\b(?:(?:(word1)|(word2))(\b.*?)){2,}(?(1)|(?!))(?(2)|(?!)) 

これはそのままうまくいくという保証を、それは私が考える基本的な考え方です。複雑なことについて私が何を意味するかを見てください。