我正在尝试匹配一个单词,但不是在它前面有评论(/*
而不是后面*/
)的情况下。到目前为止,我一直在尝试使用否定的前瞻断言来实现这一点,但没有成功。这是否可以通过消极的前瞻或消极的后视断言来实现,或者这是徒劳的努力?
问问题
125 次
1 回答
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[])
于 2012-06-30T06:50:19.067 回答