a *表示零或更多。
在字符串'abbabba'中我们有两次abba。 (abba)bba和abb(abba)。 preg_match_all仅匹配第一次出现。
我是否缺少任何基本的正则表达式基础?
$string = 'abbabba';
preg_match_all("/ab*a/", $string, $matches);
print_r($matches);
Array ( [0] => Array ( [0] => abba ) )
答案 0 :(得分:5)
将所有匹配的主题搜索到模式中给出的正则表达式,并按标志指定的顺序将它们放入匹配项中。
找到第一场比赛后,后续搜索将从最后一场比赛结束时继续。
答案 1 :(得分:3)
因为ab*a
会消耗文字。这意味着解析器与第一个匹配项abba
匹配,并从bba
重新开始,与您的模式不匹配。
答案 2 :(得分:3)
解决方案:将lookahead assertion与捕获组一起使用:
preg_match_all('/(?=(ab*a))/', $subject, $result, PREG_PATTERN_ORDER);
$result = $result[1];
答案 3 :(得分:2)
*
表示贪婪的搜索。当引擎看到b*
时,它将一直匹配到字符串的末尾并向后移动直到它到达b
,然后它将检查该点的匹配字符串是否与您的模式匹配。
首先,它看起来与a
相匹配,它就是蝙蝠。然后它会看到b*
所以它匹配字符串一直到第一个a之后字符串中最后一次出现b
(因为*
表示b应该匹配'贪婪' ),此时基本上匹配abb
。然后它看到它需要与另一个a
匹配才能成功匹配,因此它会抓取下一个字符a
,然后就完成了,剩下bba
,赢了不符合你的模式。希望这会有所帮助。
如果你这样做,欧米茄说你将获得史诗般的胜利。
答案 4 :(得分:2)
要查找出现次数,请执行以下操作:
preg_match_all('/(?=ab*a)/', $input, $result);
print(count($result[0]));
要查找匹配项,请使用:
preg_match_all('/(?=(ab*a))/', $input, $result);
print_r($result[1]);