我正在尝试匹配一个单词,但不会在其前面有注释(/*
后面没有*/
)的情况下。到目前为止,我一直试图使用负前瞻断言来实现这一目标。这是否可能带有负面的前瞻或负面的背后断言,或者这是徒劳的努力?
答案 0 :(得分:1)
我只是假设你正在编写Perl脚本,试图分析C代码。
它可能是一些单一且优雅的正则表达式,但是你必须读取整个文件并使其成为单个字符串。我记得在尝试在包含多行(\n
个字符)的字符串上运行Perl正则表达式时遇到问题,但也许只是我。
无论如何,我建议你逐行处理,处理3个案例:
/* my comment */
/* my comment starts here
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[])