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

时间:2019-01-28 09:34:12

标签: php regex

我是regex的新手,正如我所研究的,*匹配零个或多个,而+匹配一个或多个,所以我开始对此进行测试:

<?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"
}

所以我在这里想念

3 个答案:

答案 0 :(得分:3)

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

/a*/匹配0个或更多a个字符。字符串的开头和第一个a之间有0个b字符,因此与之匹配。

/a+/匹配一个或多个a字符,因此它匹配前一个a字符

这里要注意的是,正则表达式将尽早尝试匹配它正在检查的字符串。

答案 1 :(得分:2)

*表示前一项将被匹配零次或多次。

+表示前一项将被匹配一次或多次。

a*匹配为空,这就是为什么它显示为空的结果。您可以使用preg_match_all("/a*/", 'bbba',$o);,然后根据结果数组的非空值过滤结果。

答案 2 :(得分:1)

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

希望它会对您有所帮助。