Perl正则表达式前瞻问题

时间:2013-07-09 18:25:20

标签: regex perl regex-lookarounds

我是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");
}

有人可以帮助解决上述模式吗?

3 个答案:

答案 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次出现。