Почему это регулярное выражение работает только наполовину? - PullRequest
0 голосов
/ 14 января 2011

Я пытаюсь использовать регулярное выражение для сопоставления с другой строкой в ​​файле 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, я ищу его работу. По какой-то причине он не может найти его самостоятельно. Я тоже обновил свой пример.

Ответы [ 4 ]

1 голос
/ 14 января 2011

Если вы хотите найти все совпадения в строке, измените if на while и добавьте модификатор g для глобального сопоставления. @mob также прав, что вы должны использовать не жадное сопоставление.

Группа символов [0-15] эквивалентна [015]: если вы хотите соответствовать 0-15, вам следует изменить это значение на (?:[0-9]|1[0-5]). Вам не нужно убегать от :. И я предполагаю, что вы пропустили закрывающий " в своих строках по ошибке при вводе вопроса.

Работает на Рубуляр .

1 голос
/ 14 января 2011

Я бы обеспокоен тем, что секция "(?<DISK>.+)" регулярного выражения является слишком жадной и захватывает все до кавычки last на входе (многострочный?), А не кавычка.

Я бы попробовал что-то вроде

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

, то есть совпадать с одним или несколькими символами, которые не являются кавычками.

1 голос
/ 14 января 2011

Полагаю, это может быть виновник

[0-15]

. Это означает следующие цифры: 0, 1, 5. В то время как вы, вероятно, имели в виду

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

, т.е.[0 15]

0 голосов
/ 14 января 2011

Некоторые вещи, которые вы можете попробовать:
/scsi[0-3] : (?:[0-9]|1[0-5]) \. fileName \s*=\s* "(?<DISK>.+?)"/xs

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...