Мой поисковый текст выглядит следующим образом.
...
...
var strings = ["aaa","bbb","ccc","ddd","eee"];
...
...
Он содержит много строк (на самом деле файл javascript), но необходимо проанализировать значения в переменных strings, то есть aaa, bbb, ccc, ddd, eee.
Ниже приведен код Perl или используйте PHP внизу.
my $str = <<STR;
...
...
var strings = ["aaa","bbb","ccc","ddd","eee"];
...
...
STR
my @matches = $str =~ /(?:\"(.+?)\",?)/g;
print "@matches";
Я знаю, что приведенный выше сценарий будет соответствовать всем моментам, но он также будет анализировать строки ("xyz") в других строках. Поэтому мне нужно проверить строку var strings =
/var strings = \[(?:\"(.+?)\",?)/g
Используя вышеуказанное регулярное выражение, он проанализирует aaa.
/var strings = \[(?:\"(.+?)\",?)(?:\"(.+?)\",?)/g
Используя выше, получим aaa и bbb. Поэтому, чтобы избежать повторения регулярного выражения, я использовал квантификатор «+», как показано ниже.
/var strings = \[(?:\"(.+?)\",?)+/g
Но я получил только eee. Итак, у меня вопрос, почему я получил eee ТОЛЬКО при использовании квантификатора "+"?
Обновление 1: использование PHP preg_match_all (делаю это, чтобы привлечь больше внимания :-))
$str = <<<STR
...
...
var strings = ["aaa","bbb","ccc","ddd","eee"];
...
...
STR;
preg_match_all("/var strings = \[(?:\"(.+?)\",?)+/",$str,$matches);
print_r($matches);
Обновление 2: почему он соответствует eee? Из-за жадности (?:\"(.+?)\",?)+
. Удалив жадность, будет найдено соответствие /var strings = \[(?:\"(.+?)\",?)+?/
aaa. Но почему только один результат? Есть ли способ добиться этого с помощью одного регулярного выражения?