gpt4 book ai didi

php - 匹配所有出现的字符串

转载 作者:行者123 更新时间:2023-12-02 05:36:52 24 4
gpt4 key购买 nike

我的搜索文字如下。

...
...
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

使用上面的方法,将得到 aaabbb。因此,为了避免正则表达式重复,我使用了如下所示的“+”量词。

/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 将被匹配。 但为什么只有一个结果?有什么方法可以通过使用单个正则表达式来实现吗?

最佳答案

这是一个单一正则表达式的解决方案:

/(?:\bvar\s+strings\s*=\s*\[|\G,)\s*"([^"]*)"/g

\G 是一个零宽度断言,它匹配上一个匹配结束的位置(如果是第一次匹配尝试,则匹配字符串的开头)。所以这就像:

var\s+strings\s*=\s*[\s*"([^"]*)"

...第一次尝试,然后:

,\s*"([^"]*)"

...在那之后,但每场比赛都必须从最后一场比赛结束的地方开始。

这是一个 demo in PHP , 但它也适用于 Perl。

关于php - 匹配所有出现的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11559425/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com