[英]Regexp match except on comment
我正在尝试查找某些代码的所有出现,除非该代码前面带有注释。
这是我要查找的示例:
$page_content .= '<meta http-equiv="refresh"
要么
$page_content .= 'Some other text here</p><meta http-equiv="refresh"
有或没有前面的空格。 这就是我要忽略的
//$page_content .= '<meta http-equiv="refresh"
再有或没有前面的空白。
这样,我可以确保我的代码库永远不会包含该代码,除非它在注释中,或者设置一个自动警报(如果找到它)而注释掉时不会得到错误警报(暂时忽略多行注释)。
我试着用后面看
(?<!\/\/).*<meta http-equiv="refresh"
但我运气不佳,因为无论发生与否,这仍然可以匹配所有情况。
还有一件事:最好是在一个正则表达式中而不是在代码循环中,这样我可以在Notepad ++或其他支持reg exp搜索的编辑器中进行搜索。 (令人惊讶的是,一个问题可以被读/理解的方式有多么不同。我以为我已经很清楚了,但是从各种各样的完全有效的答案来看,我显然可以提供更多细节了:-)
在检查字符串之前只需删除注释
while ( <$fh> ) {
s|//.*||;
if ( /<meta http-equiv="refresh"/ ) {
...;
}
}
对于有问题的指定输入:
//$page_content .= '<meta http-equiv="refresh"
这样就可以了:
use strict;
use warnings;
open my $fh, "<", "my_path\\data.txt";
while ( my $line = <$fh>) {
if ( $line =~ /^(?!\/\/).*?<meta http-equiv=\"refresh\"/){
print $line;
}
}
如果您有更多的空格或其他缩进运算符,请使用后向运算符:
use warnings;
open my $fh, "<", "c:\\users\\uidp7702\\desktop\\data.txt";
while ( my $line = <$fh>) {
if ( $line =~ /(?<!\/\/)\$page_content\s.=\s\'.*?<meta http-equiv=\"refresh\"/){
print $line;
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.