[英]Is it possible to AND two separate lookaround/zero-width assertions (i.e. lookbehind/look-behind) in a regular expression?
我正在使用Perl来解决这个正则表达式问题,但是最好知道它是否也适用于PHP。
我需要注释掉所有打印语句或PHP文件中所有以print开头的内容。 看起来像这样:
<?php
// Description of file
...
print("Foobar");
// print("Foo");
//print("bar");
// Open and print file
function printtemplate($file) {
...
}
...
printtemplate($file);
...
?>
首先,我制定了如下正则表达式:
((?<!function )|(?<!//))print
它显然不起作用,因为|
是一个OR。 我正在寻找AND,因此两个否定的后向断言都必须为真。 AND构造是否以某种形式存在于正则表达式中,或者有一种方法可以模拟它?
最终,在应用正则表达式之后,我希望php文件如下所示:
<?php
// Description of file
...
//print("Foobar");
// print("Foo");
//print("bar");
// Open and print file
function printtemplate($file) {
...
}
...
//printtemplate($file);
...
?>
任何帮助,将不胜感激。 谢谢。
只是将它们彼此相邻。 而已。 它将创建AND效果,因为您需要先传递两个环顾四周,然后才能匹配它们之后的所有内容。
在您的情况下,它将是:
(?<!function )(?<!//)print
但是,请注意,上面的正则表达式将返回假肯定,这将导致添加不必要的注释。 演示
对于PCRE(在PHP中使用),后置断言要求模式严格地固定长度,因此不可能在所有情况下都使用后置断言检查print
是否被注释掉或不将其排除。 @mpapec的答案提供了一种适用于编写良好代码的解决方案,并且比带有正则表达式的正则表达式具有更好的覆盖范围。
这是适用于给定示例的简单方法,
s|^ (\s*) (print) |$1//$2|xmg;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.