ab * a的正则表达式问题

时间:2012-07-21 11:19:35

标签: php regex

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

5 个答案:

答案 0 :(得分:5)

  

将所有匹配的主题搜索到模式中给出的正则表达式,并按标志指定的顺序将它们放入匹配项中。

     

找到第一场比赛后,后续搜索将从最后一场比赛结束时继续。

Source

答案 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]);