2

a* 表示零个或多个 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 ) ) 
4

5 回答 5

5

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

找到第一个匹配后,从最后一个匹配的末尾继续进行后续搜索。

来源

于 2012-07-21T11:21:12.520 回答
3

因为ab*a消耗文本。这意味着解析器匹配第一次出现abba并从 重新开始bba,与您的模式不匹配。

于 2012-07-21T11:23:30.450 回答
3

解决方案:将前瞻断言与捕获组一起使用:

preg_match_all('/(?=(ab*a))/', $subject, $result, PREG_PATTERN_ORDER);
$result = $result[1];
于 2012-07-21T11:28:14.193 回答
2

*表示贪婪搜索。当引擎看到b*它将一直匹配到字符串的末尾并向后移动直到到达 ab时,它将检查匹配到该点的字符串是否与您的模式匹配。

首先,它看起来与 匹配a,它马上就完成了。然后它看到b*它一直匹配字符串,直到b第一个 a 之后的字符串中最后一次出现 (因为*表示 b 应该匹配“贪婪”),abb此时基本上匹配。然后它看到它需要匹配另一个a才能成功匹配,所以它抓取下一个字符,即 an a,然后完成,留下bba剩余的,这与您的模式不匹配。希望这可以帮助。

如果你按照欧米茄所说的去做,你将获得史诗般的胜利。

于 2012-07-21T11:28:49.397 回答
2

要查找出现次数,请使用:

preg_match_all('/(?=ab*a)/', $input, $result); 
print(count($result[0]));

要查找匹配项,请使用:

preg_match_all('/(?=(ab*a))/', $input, $result); 
print_r($result[1]);
于 2012-07-21T11:42:41.540 回答