【发布时间】:2012-07-18 13:17:55
【问题描述】:
我的搜索文字如下。
...
...
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 将被匹配。 但为什么只有一个结果?有没有什么方法可以通过使用单个正则表达式来实现?
【问题讨论】:
标签: php regex perl preg-match-all