【问题标题】:Regexp match except on comment正则表达式匹配,除了评论
【发布时间】:2017-01-10 17:45:46
【问题描述】:

我正在尝试查找所有出现的某些代码,除非该代码前面有注释。

这是我要查找的示例:

$page_content .= '<meta http-equiv="refresh"

$page_content .= 'Some other text here</p><meta http-equiv="refresh"

前面有或没有空格。 这是我想忽略的内容

//$page_content .= '<meta http-equiv="refresh"

前面有或没有空格。

这样我可以确保我的代码库永远不会包含此代码,除非它在注释中,或者如果发现它时设置一个自动警报,而不会在其被注释掉时收到错误警报(暂时忽略多行 cmets) .

我尝试过使用look behind

(?<!\/\/).*<meta http-equiv="refresh"

但我运气不佳,因为无论是否评论,这仍然匹配每次出现。

还有一件事:如果它在一个正则表达式中而不是在一个代码循环中,那就太好了,这样我就可以在 Notepad++ 或其他支持正则表达式搜索的编辑器中进行搜索。 (令人惊讶的是,一个问题的阅读/理解有多么不同。我以为我已经很清楚了,但是从各种完全有效的答案中,很明显我可以包含更多细节:-)

【问题讨论】:

  • 考虑你使用的是贪心算子.*
  • #^[^/]{2}.*#m 可以解决
  • /^(?!\/\/)/ 你试过否定匹配吗?这将忽略以// 开头的所有内容
  • 多线cmets呢?如果你不在乎,我想你可以使用这个答案的倒数:stackoverflow.com/questions/32462878/… ... ^\h*//.*$(*SKIP)(*FAIL)|.*

标签: php regex perl


【解决方案1】:

对于有问题的输入:

//$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;
    }
}

【讨论】:

  • 谢谢。这似乎适用于没有缩进或前面空白的行。但是,如果它是缩进的,那么它匹配所有的,包括注释的和未注释的。所以我删除了行的开头 ^ 并且它仍然匹配所有...所以我将带有空格的 ^ 读取为 ^\s* 和 ^ * 但仍然匹配所有。
  • 那么您应该在问题中指定输入的所有变体
  • 我已更新问题以反映这一点。我的想法是,由于这是一个正则表达式,它应该匹配行中的任何位置,前面的空格或后面的空格,或者之前或之后的其他代码。而不是与我给出的示例行完全匹配
  • 你不能像.* (negative look-behind) .* 那样使用消极的look-behind
  • 所以你要么做一个两步正则表达式,要么使用@borodin 的答案
【解决方案2】:

在检查字符串之前删除注释

while ( <$fh> ) {

    s|//.*||;

    if ( /<meta http-equiv="refresh"/ ) {
        ...;
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-12-23
    • 2021-12-31
    • 2011-10-09
    • 2015-04-09
    • 2017-08-04
    • 1970-01-01
    • 2017-03-24
    • 1970-01-01
    相关资源
    最近更新 更多