我很困惑 perl 中这些环视断言的用途是什么?
例如这个:
(?=pattern)
或积极的前瞻。所以这是我的问题:
如果可能的话,我需要一个非常明确的例子。谢谢
最佳答案
要大写逗号之间的内容,您可以使用:
(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