0

「or」、「and」、「not」などの演算子を使用して、 「 Google 」スタイルの文字列を検索したいと考えています。この演算子を正規表現でシミュレートすることは可能ですか?

たとえば、「Javascript」、「PHP」、および「Perl」という単語を使用して、特定の文字列で次の検索を実行したいとします。

  1. JavaScript と PHP
  2. PHPではなくJavascript
  3. Javascript と PHP と Perl
  4. Javascript および (PHP または Perl)

PS: すべての重要な言語にはオプションがあるため、大文字と小文字を区別する問題は気にしません。

コメント後の編集: いくつかのパターン マッチング スキャンを使用して任意のブール式を実行できることは明らかですが、単一の正規表現内でソリューションを考えるのは興味深いことです。また、「先読み」機能により、非常に複雑なパターン マッチングの問題を解決できます。

4

1 に答える 1

2

はい!

Perl言語の正規表現構文で導入された「look forward」演算子に感謝します。Perl RegEx フレームワークは、PHPJavascriptを含む多くの言語で使用されています。

Perl には「後読み」演算子も存在しますが、 Javascriptではサポートされていません。

以下に、検索用のJavaScript構文を使用した正規表現を示します。

1- (「Javascript」および「PHP」)の検索

       S = "Javascript is a client language and PHP is a server language";
       patt = /^(?=.*Javascript).*PHP/;    
       if ( S.match(patt) ) 
         document.write("Found it!"); 
       else 
          document.write("Not Found");

「見つかりました」と表示されます。

2-現在検索中(「PHP」ではなく「Javascript」)

     S = "Javascript is a client language and PHP is a server language"; 
     patt = patt = /^(?!.*PHP).*Javascript/;
     if ( S.match(patt) ) 
       document.write("Found it!"); 
     else 
       document.write("Not Found");

文字列に PHP が含まれているため、「Not Found」と出力されます。

3- 3 番目の検索は(「Javascript」と「PHP」と「Perl」)

    S = "Javascript rules, PHP are in most server, however Perl is inspiring";
    patt = /^(?=.*Javascript)^(?=.*PHP).*Perl/;
    if ( S.match(patt) ) 
       document.write("Found it!"); 
    else 
       document.write("Not Found");

「見つかりました!」と表示されます。.

4-最後に、最後のケースは ( "Javascript"および ( "PHP"または"Perl" )) です。違いはありません。従来のグループ化を括弧 (丸括弧) で使用するだけです。

    S = "Javascript rules, however Perl is inspiring"; 
    patt = /^(?=.*Javascript)(.*PHP|.*Perl)/;
    if ( S.match(patt) ) 
       document.write("Found it!"); 
    else 
       document.write("Not Found");

「見つかりました!」と表示されます。PHPはありませんが、Perlは文字列になっているためです。

コメントの後に編集:

私はそれを認めました。「Look Forward」の構文はひどいものです。しかし、それは簡単に理解できます。スキャナーは見ますが、歩かないでください!

        patt = /Bee (?=Gees)/;     // patt = patt1(?=patt2) => patt1 + patt2 
        S = "Bee Gees";
        if (S.match(patt)) 
              document.write('ok');  // print OK and cursor stops at "G"

それがポジティブな楽しみです

       patt = /Bee (?!Gees)/;   // patt = patt1(?!patt2) => patt1 + Not (patt2) 
       S = "Bee Gees";         
       if (S.match(patt)) 
             document.write('ok'); // it does not match
       S = "Bee Goes";         
       if (S.match(patt)) 
             document.write('ok'); // print OK and cursor stops at "G"

それがネガティブな前向きです

すばらしいニュースは、Patt2がグループ化、サブグループ化などの複雑なパターンになる可能性があることです。

最終的な説明:

  • .* : 0 文字以上
  • ^ : が文字列の先頭である場合に一致します。カーソルは移動しません。
  • $ : が文字列の末尾である場合に一致します。カーソルは移動しません。
  • (p1|p2|...) : p1またはp2または ... が一致する場合に一致します。

そう

         patt = /^(?=.*Javascript).*PHP/; 

は正規表現 ( /は文字列への引用符としての RegEx 区切り文字) であり、前方参照(「Javascript」が見つかるまで文字をジャンプする) を意味し、成功した場合は「PHP」が見つかるまで文字をジャンプ します (前方参照が行われないことを覚えておいてください) 。 't はカーソルを動かしません!) つまり、スキャナーが「Javascript」を検出した場合にのみ「PHP」が一致します。

于 2013-02-23T15:07:14.243 に答える