我的搜索文本如下。
...
...
var strings = ["aaa","bbb","ccc","ddd","eee"];
...
...
它包含许多行(实际上是一个 javascript 文件)但需要解析变量字符串中的值,即 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将被匹配。但为什么只有一个结果?有没有什么办法可以通过使用单个正则表达式来实现?