为什么这个正则表达式只有一半工作?

时间:2011-01-14 19:17:42

标签: regex perl

我正在尝试使用正则表达式来匹配VMX文件中的另一行,但它只有“一半”有效。我会解释一下。

我尝试匹配的行是scsi0:0.fileName = "Test01.vmdk。我的正则表达式似乎工作正常。现在是曲线球,如果我尝试使用相同的正则表达式来查找scsi0:1.fileName = "Test01_1.vmdk。我的正则表达式找不到它,只显示它为每个VM找到的第一个磁盘。我知道我错过了一些我不能把手指放在上面的东西。唯一奇怪但但我认为没有任何区别的是第二个磁盘scsi0:1.fileName = "Test01_1.vmdk的行位于文件的底部,而scsi0:0.fileName = "Test01.vmdk的行位于文件的中间位置。文件后面有其他选项的更多行。正则表达式是否过早停止?这甚至可能吗?

无论如何这里是我正在处理的代码块。

    foreach my $vm (@virtual_machines) {
    my $vmx_file = $ssh1->capture("cat $virtual_machines{$vm}{VMX}");
    my $inc = -1;
    if ($vmx_file =~ m/scsi([0-3]):([0-9]|1[0-5])\.fileName\s+=\s+"(?<DISK>\w+?\.vmdk)"/xm) {
        ++$inc;
        $virtual_disks{$vm}{"Disk$inc"} = "$+{DISK}";
    }

这很奇怪,但如果我明确插入SCSI ID的数字我正在寻找它的工作。由于某种原因,它无法单独找到它。我也更新了我的例子。

4 个答案:

答案 0 :(得分:1)

我想这可能是罪魁祸首

[0-15]

这意味着以下数字:0,1,5。而你可能意味着

([0-9]|1[0-5])

即。 [0 15]

范围内的所有数字

答案 1 :(得分:1)

如果要查找字符串中的所有匹配项,请将if更改为while并添加g修饰符以进行全局匹配。 @mob也应该使用非贪婪匹配。

字符组[0-15]相当于[015]:如果要匹配0-15,则应将其更改为(?:[0-9]|1[0-5])。您无需转义:。我猜你在输入问题时错误地遗漏了字符串中的结尾"

适用于rubular

答案 2 :(得分:1)

我担心正则表达式的"(?<DISK>.+)"部分过于贪婪并且在(多行?)输入中捕获到 last 引号的所有内容而不是< em> next 引号。

我会尝试像

这样的东西
"(?<DISK>[^"]+)"

也就是说,匹配一个或多个不是引号的字符。

答案 3 :(得分:0)

你可以尝试的一些事情:
/scsi[0-3] : (?:[0-9]|1[0-5]) \. fileName \s*=\s* "(?<DISK>.+?)"/xs