0

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

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

4

3 回答 3

0

根据我的评论,我首先担心的是您的else声明说“test2”没有被评论,但这似乎与您的正则表达式所寻找的相反。

其次,look-ahead向前看字符串,即匹配模式之后的字符很有用。要匹配模式之前的字符,您需要向后看。你可以使用look-behind来做到这一点:

if($string =~ /(?<!\/\/)test2*/)

这是关于 Perl 前瞻和后瞻的教程,它应该为您提供更多信息。

于 2013-07-09T18:38:59.360 回答
0

Regexp::Common从 CPAN https://metacpan.org/module/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";
}
于 2013-07-09T20:26:40.883 回答
0

是否不止一次出现test2

test2这将检查字符串中是否有注释出现

$str =~ m|//[^\S\n]*test2|;

所以

$str !~ m|//[^\S\n]*test2|;

将告诉您是否没有评论出现test2.

于 2013-07-09T22:28:19.657 回答