perl regex将多行与空格和非单词字符匹配

时间:2016-06-03 22:04:55

标签: regex perl

想要检查版权是否完全符合规定:

my $copyright_RE= '\s*[^\w]*\s*'."\QCopyright (c) \E".'(\d.*)'."\Q by Bill Shakespeare.\E".'\s*[^\w]*\s*\n*'.
             '\s*[^\w]*\s*'."\QAll Rights Reserved.\E".'\s*[^\w]*\s*\n*'.
             '\s*[^\w]*\s*'."\QGraw Hill publishers, Inc.\E".'\s*[^\w]*\s*\n*';

my $file_head=`head -n 100 /tmp/sample.txt`;
if ($file_head !~ /$copyright_RE/i) {
       print "\nInvalid copyright, or copyright missing\n";

} else {
       print "\ncopyright is good\n";
}

这样可行,但有更好的方法来指定" $ copyright_RE"和模式匹配?

sample.txt有:

# Copyright (c) 2008,2009-2011 by Bill Shakespeare. # 
$     All rights reserved.                          $
*     Graw Hill publishers, Inc.                    *

1 个答案:

答案 0 :(得分:0)

我猜您可以使用qr// x 选项进行预编译。

$copyright_RE = qr/
     \s* [^\w]* \s* 
     \QCopyright (c) \E
     ( \d .* )                     # (1)
     \Q by Bill Shakespeare.\E
     \s* [^\w]* \s* \n* 
     \s* [^\w]* \s* 
     \QAll Rights Reserved.\E
     \s* [^\w]* \s* \n* 
     \s* [^\w]* \s* 
     \QGraw Hill publishers, Inc.\E
     \s* [^\w]* \s* \n* 
/xi;

但是,这个正则表达式在不匹配时会出现回溯问题。

最好限制回溯的灾难性潜力 我尝试用以下更改来做到这一点。

注意 atomic 组以及(?>)

另请注意,[^\w]也匹配空格\s 也可以在正确的时候摆脱正则表达式中的所有\s

 use strict;
use warnings;

$/ = undef;

my $copyright_RE = qr/
(?>
      [^\w]*  
      \QCopyright (c) \E
      ( \d .* )                     # (1)
      \Q by Bill Shakespeare.\E
      [^\w]*  
      \QAll Rights Reserved.\E
      [^\w]*  
      \QGraw Hill publishers, Inc.\E
      [^\w]*  
 )
/xi;


my $file_head = <DATA>;

print $file_head, "\n";

if ($file_head !~ /$copyright_RE/ ) {
       print "\nInvalid copyright, or copyright missing\n";
} else {
       print "\ncopyright is good ($1)\n";
}    

__DATA__
# Copyright (c) 2008,2009-2011 by Bill Shakespeare. # 
$     All rights reserved.                          $
*     Graw Hill publishers, Inc.                    *

试一试。