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

bla*_*eon 2 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.
Run Code Online (Sandbox Code Playgroud)

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

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

Sob*_*que 6

怎么样:

if ( $line =~ m/Disk [1-9]\d*/ ) {
Run Code Online (Sandbox Code Playgroud)

将匹配"磁盘1","磁盘300"等,但不匹配"磁盘0".

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

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

例如:

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

将打印:

1234567
8
9
Run Code Online (Sandbox Code Playgroud)