正则表达式匹配某些表达式并排除特定表达式

时间:2015-04-27 13:39:51

标签: regex perl

我试图让我的perl脚本搜索特定模式,但随后排除一个可能的结果。这个想法如下:

foreach my $line (@lines)
{
    if (($line =~ m/  Disk (\d+)(\d+)(\d+)/)
     || ($line =~ m/  Disk (\d+)(\d+)/)
     || ($line =~ m/  Disk (\d+)/)
     && ($line =~ /^(?:(?!  Disk 0).)*$/)
    ) {
        print("here\n");
    }
}
# if the line contains anything like "Disk 1", "Disk 20", or "Disk 300"
# it will print "here" - but if it is "Disk 0" it will not.

当我执行脚本时,它会卡在这部分上并且永远不会完成脚本。这是正确的语法吗?

我的正则表达式可能有点乱,因为我对perl语法很新,所以如果有办法清理if语句请告诉我,谢谢!

1 个答案:

答案 0 :(得分:6)

怎么样:

if ( $line =~ m/Disk [1-9]\d*/ ) {

将匹配“磁盘1”,“磁盘300”等,但不匹配“磁盘0”。

顺便提一下 - 括号是捕获组。你有正则表达式中的那些,但似乎没有使用它们(所以我省略了它们)。

同样(\d+)(\d+)(\d+)一个或多个位数的3次出现。这几乎肯定不是你的意思,它无论如何都不会起作用,因为第一组将捕获除两个数字之外的所有数字。

e.g:

my $string = "123456789";
my @captured = $string =~ m/(\d+)(\d+)(\d+)/;
print join ("\n", @captured);

将打印:

1234567
8
9