我的搜索文本如下。匹配所有出現的字符串
...
...
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串=
/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將匹配。 但爲什麼只有一個結果呢?有沒有什麼辦法可以通過使用單個正則表達式來實現?
是的,它的工作。謝謝... :-)。但是,你能解釋一下爲什麼它對'/ var strings = \ [(?:\「(。+?)\」,?)+?/'? – Jithin 2012-07-19 12:17:34
如果您從Perl版本中離開'g',或者調用'preg_match'而不是'preg_match_all',則會看到您獲得相同的結果;你實際上只做一場比賽。在該匹配中,捕獲組中的部分被多次應用,每次覆蓋最後一次傳遞的結果。我正在做多個比賽,並分別保存每場比賽的結果。 – 2012-07-19 13:20:28