代码之家  ›  专栏  ›  技术社区  ›  Chris Chris

需要帮助理解Perl lookbacking以排除和包含模式

  •  1
  • Chris Chris  · 技术社区  · 2 年前

    我只想要上面数组的以下输出:

    going pro
    staying pro
    

    我在下面使用的代码没有达到这个目标。

       my @proFilter = ("a pro linebacker","a pro review","the pro not playing like a pro","going pro","staying pro");
    
       foreach $textLine (@proFilter)
       {
         if($textLine =~ /((?<!\b(a|the)\b) pro [a-z]+)/g)
         {
           print "$1\n"; 
         }
       }
    
    1 回复  |  直到 2 年前
        1
  •  1
  •   Barmar    2 年前

    使用lookahead代替lookbacking,并将其与 [a-z]+ 匹配一个不匹配的单词 a the .

    /(\b(?!\b(?:a|the)\b)[a-z]+\b) pro/g
    

    DEMO

        2
  •  0
  •   Wiktor Stribiżew    2 年前

    您的正则表达式匹配 pro +空格+一个或多个小写ASCII字母,该字母前面总是有一个不紧跟在前面的空格 a the 完整的单词。请注意,您的模式不匹配 going pro staying pro 不仅因为背后的人,还因为 [a-z]+ .

    至于固定宽度的lookbacking模式问题,您所需要的只是匹配您想要避免匹配的模式并应用 (*SKIP)(*F) :

    \b(?:a|the)\s+pro\b(*SKIP)(*F)|\bpro\b
    

    请参阅 regex demo .

    细节 :

    • \b(?:a|the)\s+pro\b(*SKIP)(*F) :
      • \b -单词边界
      • (?:a|the) -非捕获组匹配 这个
      • \s+ -一个或多个空白
      • 赞成的意见 -一个词
      • \b -另一个单词边界
      • (*跳过)(*F) -两个动词使正则表达式引擎在当前位置失败,然后从该失败位置(而不是字符串中的下一个位置)继续搜索下一个匹配项
    • | -或者
    • \bpro\b -一个完整的单词 赞成的意见 .