0

我正在尝试匹配一个单词,但不是在它前面有评论(/*而不是后面*/)的情况下。到目前为止,我一直在尝试使用否定的前瞻断言来实现这一点,但没有成功。这是否可以通过消极的前瞻或消极的后视断言来实现,或者这是徒劳的努力?

4

1 回答 1

1

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

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

无论如何,我建议您逐行处理,注意 3 种情况:

  1. 单行注释:/* my comment */
  2. 注释从当前行开始:/* my comment starts here
  3. 以当前行结尾的注释: my comment ends here */

从正在分析的文本中删除评论,然后在其余部分中搜索您的单词。像这样的东西:

#!/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[])
于 2012-06-30T06:50:19.067 回答