繁体   English   中英

正则表达式匹配(评论除外)

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM