我是Perl的新手,需要知道一种模式来帮助我检查以下内容:
$string="test1\n // test2 \n test3 ";
我想要一个模式来检查test2
是否未被评论。我读到了关于积极和消极的展望,并试图实现相同但它对我不起作用。
以下是代码段:
$string = "test3\n//test2\ntest3";
if ($string =~ /(?!\/\/)test2*/) {
$matched = $&;
print("$matched");
}
else {
print("No comments before test2");
}
有人可以帮助解决上述模式吗?
答案 0 :(得分:0)
根据我的评论,我首先关注的是你的else
声明说“test2”没有被评论,但这似乎与你的正则表达式相反。
其次,前瞻将转发转换为字符串,即在模式之后匹配字符非常有用。要在模式之前匹配字符,您需要向后看 。你可以使用look-behind做到这一点:
if($string =~ /(?<!\/\/)test2*/)
这里的a tutorial on Perl look-ahead and look-behind可以为您提供更多信息。
答案 1 :(得分:0)
从CPAN https://metacpan.org/module/Regexp::Common加载Regexp::Common
并使用其Regexp::Common::comment
#!/usr/bin/env perl
use strict;
use warnings;
# --------------------------------------
use charnames qw( :full :short );
use English qw( -no_match_vars ) ; # Avoids regex performance penalty
my $string="test1\n // test2 \n test3 ";
use Regexp::Common qw( comment );
if( $string =~ m/ ( $RE{comment}{'C++'} ) /msx ){
my $comment = $1;
if( $comment =~ m{ test2 }msx ){
print $comment;
}else{
goto NO_COMMENTS_TEST2;
}
}else{
NO_COMMENTS_TEST2:
print "No comments before test2\n";
}
答案 2 :(得分:0)
是否有多次出现test2
?
这将检查字符串
中是否有test2
的注释
$str =~ m|//[^\S\n]*test2|;
所以
$str !~ m|//[^\S\n]*test2|;
会告诉您是否有{em>没有评论的test2
次出现。