0

我想使用“或”、“与”和“非”等运算符在具有“谷歌”风格的字符串中进行搜索。可以在正则表达式中模拟这个运算符吗?

例如,我想使用单词“Javascript”、“PHP”和“Perl”在给定的字符串中进行以下搜索。

  1. Javascript 和 PHP
  2. Javascript而不是PHP
  3. Javascript 和 PHP 和 Perl
  4. Javascript 和(PHP 或 Perl)

PS:我不介意区分大小写的问题,因为所有重要的语言都有一个选项。

评论后编辑:很明显,可以使用多个模式匹配扫描运行任何布尔表达式,但是,在单个正则表达式中考虑解决方案很有趣。此外,“前瞻”功能可以解决非常复杂的模式匹配问题。

4

1 回答 1

2

是的!

感谢“期待”运算符,它是在Perl语言的正则表达式语法中引入的。Perl RegEx 框架被许多语言使用,包括PHPJavascript

Perl 中也存在“look behind”运算符,但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-现在搜索(“Javascript”而不是“PHP”)

     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 包含在字符串中。

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 在字符串中。

评论后编辑:

我已经承认了。“向前看”的语法很糟糕。但是,这很容易理解。扫描仪看着但不要走路!

        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|...) :如果p1p2或 ... 匹配,则匹配。

所以

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

是一个正则表达式(/是一个正则表达式分隔符,作为字符串的引号),表示期待(跳转字符直到找到“Javascript”),如果成功,跳转字符直到找到“PHP” (请记住,期待不会'不要移动光标!) 即,如果扫描仪找到“Javascript”,“PHP”就匹配。

于 2013-02-23T15:07:14.243 回答