我试图让我的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语句请告诉我,谢谢!
答案 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