Предполагается, что не может быть разумного вложения
my @quoted = $string =~ /"([^"]+)"/g;
или, если вам нужно уметь обрабатывать их, собирая их
my @quoted;
while ($string =~ /"([^"]+)"/g) { #" (stop faulty markup highlight)
# ...
push @quoted, $1;
}
Обратите внимание, что нам нужно закрытие "
, хотя [^"]+
будет соответствовать ему в любом случае. Это сделано для того, чтобы двигатель его потреблял и проходил мимо, поэтому следующее совпадение "
действительно является следующим открытием.
Если кавычки " также могут быть" вложены "", тогда вы захотите Text::Balanced
Кроме того, обратите внимание на различие в поведении модификатора /g
в списке и скалярных контекстах .
В контексте списка, навязанном списком (в первом примере - @quoted
), с модификатором /g
оператор match возвращает список всех захватов, или всех совпадений, если в шаблоне нет захвата (без паренов)
В скалярном контексте, когда оценивается как условие while
(например), его поведение с /g
является более сложным. После сопоставления в следующий раз, когда регулярное выражение запускается, оно продолжает поиск строки с позиции (один после) предыдущего совпадения, перебирая совпадения.
Обратите внимание, что нам не нужен цикл для этого (что является тонкой причиной для тонких ошибок)
my $string = q(one simple string);
$string =~ /(\w+)/g;
say $1; #--> one
$string =~ /(\w+)g;
say $1; #--> simple
Без /g
ни в одном из регулярных выражений мы не получаем такого поведения, скорее, one
печатается оба раза.
См. Глобальное соответствие в perlretut , и, например, \G
утверждение в perlop и pos