我正在尝试使用正则表达式来匹配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的数字我正在寻找它的工作。由于某种原因,它无法单独找到它。我也更新了我的例子。
答案 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