我很困惑 perl 中这些环视断言的用途是什么?

例如这个:

(?=pattern)

或积极的前瞻。所以这是我的问题:
  • 这些有什么用?他们使用什么样的实例?
  • 与问题 1 相关,为什么我要提前查看正则表达式模式?这不是更多的工作吗?向前看,然后再次执行模式匹配。

  • 如果可能的话,我需要一个非常明确的例子。谢谢

    最佳答案

    要大写逗号之间的内容,您可以使用:

    (my $x = 'a,b,c,d,e') =~ s/(?<=,)([^,]*)(?=,)/ uc($1) /eg;   # a,B,C,D,e
    
                      a,b,c,d,e
    Pass 1 matches      -
    Pass 2 matches        -
    Pass 3 matches          -
    

    如果你不使用环视,这就是你会得到的,
    (my $x = 'a,b,c,d,e') =~ s/,([^,]*),/ ','.uc($1).',' /eg;   # a,B,c,D,e
    
                      a,b,c,d,e
    Pass 1 matches     ---
    Pass 2 matches         ---
    

    前瞻不仅避免了重复,没有它就无法工作!

    另一个比较常见的用途是作为等价于 [^CHAR] 的字符串的一部分。
    foo(?:(?!foo|bar).)*bar  # foo..bar, with no nested foo or bar
    

    您可以使用它来缩小字符类。
    \w(?<!\d)     # A word char that's not a digit.
    

    虽然现在可以使用 (?[ ... ]) 来完成。

    它在更深奥的模式中也很有用。
     /a/ && /b/ && /c/
    

    可以写成
     /^(?=.*?a)(?=.*?b).*?c/s
    

    10-08 19:25