2011-01-14 71 views
0

我想使用正则表达式来匹配VMX文件中的另一行,但它只有“一半”的作品。我会解释。为什么这个正则表达式只有一半工作?

我试图匹配的行例如是scsi0:0.fileName = "Test01.vmdk。我的正则表达式似乎正常工作。现在曲线球,如果我尝试使用相同的正则表达式来寻找scsi0:1.fileName = "Test01_1.vmdk。我的正则表达式找不到它,只显示它为每个虚拟机找到的第一个磁盘。我知道我错过了一些我不能把手指放在上面的东西。唯一奇怪的是,但我认为没有什么区别,第二张磁盘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的号码,我正在寻找它的工作。由于某种原因,它无法自己找到它。我也更新了我的例子。

+3

因为它是半正确 – Ben 2011-01-14 19:23:40

+0

但在我的情况下,是不是就+顾及一切从A-Z,A-Z,0-9和下划线和连字符。? – ianc1215 2011-01-14 19:27:35

+2

不是现在问题的答案,但我想你会发现你的'[0-15]'角色班不会做你想做的。这将匹配0,1或5. – Aron 2011-01-14 19:27:44

回答

1

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

字符组[0-15]相当于[015]:如果要匹配0-15,则应将其更改为(?:[0-9]|1[0-5])。你不需要转义:。我假设你在输入问题时误将字符串中的"忽略掉了。

适用于rubular

1

我想这可能是罪魁祸首

[0-15] 

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

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

即所有的数字范围为[0 15 ]

1

我担心的是,正则表达式的"(?<DISK>.+)"部分是太贪婪和捕获的一切行动在(多行?)的最后引号输入,而不是下一个引号。

我会尝试像

"(?<DISK>[^"]+)" 

这是说,匹配一个或多个字符不在引号。

0

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

相关问题