无法理解正则表达式中*和+量词的区别。

4

我对正则表达式还不太熟悉,但是我了解到 * 可以匹配零个或多个字符,而 + 则可以匹配一个或多个字符。因此,我开始进行测试:

<?php
preg_match("/a/", 'bbba',$m);
preg_match("/a*/", 'bbba',$o);
preg_match("/a+/", 'bbba',$p);
echo '<pre>';
    var_dump($m);
    var_dump($o);
    var_dump($p);
echo '</pre>';  
?>

但结果是 * 没有匹配到任何内容并返回空,而字母 a 是存在的:
array(1) {
  [0]=>
  string(1) "a"
}
array(1) {
  [0]=>
  string(0) ""
}
array(1) {
  [0]=>
  string(1) "a"
}

那么我在这里漏掉了什么。


4
因为 a* 也可以匹配空字符串,所以显示出了一个空结果。 - user1334621
a*匹配成功,它匹配了零个"a"。 - Psytho
@catcon 谢谢,我已经转换到 preg_match_all,现在我可以将每个步骤的结果存储在数组中。 - Mohamed Omar
3个回答

6

/a/匹配bbba中的第一个a

/a*/匹配0个或多个a字符。在字符串开头和第一个b之间没有a字符,因此它会匹配到那里。

/a+/匹配1个或多个a字符,因此它匹配到第一个a字符

需要注意的是,正则表达式会尽可能早地在正在检查的字符串中进行匹配。


这是“懒惰”行为。关于正则表达式,这种行为有一个很好的解释,请参见[此处][1]。 [1]: https://dev59.com/qnE95IYBdhLWcg3wdtqj - James Sheils

3

a* 表示匹配可能不包含 a 的字符串,因为 * 匹配零个或多个,
因此模式 a* 甚至可以匹配空字符串。 要查看所有匹配项,您可以使用 preg_match_all,例如:

<?php
preg_match_all("/a*/", 'bbba', $o);
var_dump($o);

作为结果,您将看到:
array(1) {
  [0]=>
  array(5) {
    [0]=>
    string(0) ""
    [1]=>
    string(0) ""
    [2]=>
    string(0) ""
    [3]=>
    string(1) "a"
    [4]=>
    string(0) ""
  }
}

希望它能对你有所帮助。


1
非常感谢,这行代码让“匹配不包含a的字符串”更加清晰明了,与@JGNI的答案完美结合。再次感谢你们两位。 - Mohamed Omar
@MohamedOmar 随时欢迎! - cn007b
我认为如果我们说“匹配任何空或a”,会更准确,因为如果匹配任何不包含的字符串,那么意味着匹配任何东西,比如b。 - Mohamed Omar
在你展示的结果中,如果没有任何东西返回,则会显示“nothing”,如果有返回但没有更多内容,则会显示“if”。 - Mohamed Omar

2

* 表示前面的项目将匹配零次或多次。

+ 表示前面的项目将匹配一次或多次。

此外,a* 匹配空值,因此它显示为空结果。您可以使用 preg_match_all("/a*/", 'bbba',$o);,然后过滤结果中非空值的数组。

原始答案:Original Answer


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接