匹配一个单词,但不在评论中

时间:2012-06-30 02:36:42

标签: regex negative-lookahead negative-lookbehind

我正在尝试匹配一个单词,但不会在其前面有注释(/*后面没有*/)的情况下。到目前为止,我一直试图使用负前瞻断言来实现这一目标。这是否可能带有负面的前瞻或负面的背后断言,或者这是徒劳的努力?

1 个答案:

答案 0 :(得分:1)

我只是假设你正在编写Perl脚本,试图分析C代码。

它可能是一些单一且优雅的正则表达式,但是你必须读取整个文件并使其成为单个字符串。我记得在尝试在包含多行(\n个字符)的字符串上运行Perl正则表达式时遇到问题,但也许只是我。

无论如何,我建议你逐行处理,处理3个案例:

  1. 单行评论:/* my comment */
  2. 从当前行开始评论:/* my comment starts here
  3. 以当前行结尾的评论:my comment ends here */
  4. 从正在分析的文本中删除评论,然后在其余部分中搜索您的单词。像这样:

    #!/usr/bin/perl
    use strict;
    use warnings;
    
    my $word = shift;
    my $line_no = 0;
    my $whole_line = "";
    
    my $in_comment = 0;
    
    sub word_detection
    {
        while ($_ =~ /\b($word)\b/g)
        {
            print "'$1' found on line $line_no: $whole_line\n";
        }
    }
    
    while (<>)
    {
        chomp;
        $whole_line = $_;
        $line_no ++;
    
        $_ =~ s/\/\*.*?\*\///;
    
        if ($_ =~ /\/\*/)
        {
            my @split = (split /\/\*/,  $_);
            $_ = $split[0];
            $in_comment = 1;
            word_detection $_;
        }
        elsif ($_ =~ /\*\//)
        {
            my @split = (split /\*\//,  $_);
            $_ = $split[1];
            $in_comment = 0;
            word_detection $_;
        }
        elsif (not $in_comment)
        {
            word_detection $_;
        }
    }
    

    使用您的单词作为第一个参数(下例中的“int”)运行此脚本,然后运行您的文件名。它应该做的工作:

    $ match-word int test.cc
    'int' found on line 11: int /* comment on one line */ x = 10;
    'int' found on line 13: int y; /* and this is
    'int' found on line 15:     comment */ int z;
    'int' found on line 17: int main(int argc, char* argv[])
    'int' found on line 17: int main(int argc, char* argv[])