【问题标题】:can't understand the difference between * and + quantifiers in REGEX [duplicate]无法理解 REGEX 中 * 和 + 量词之间的区别 [重复]
【发布时间】:2019-01-28 09:34:12
【问题描述】:

我是正则表达式的新手,正如我所研究的那样,* 匹配零个或多个,+ 匹配一个或多个,所以我开始测试这个:

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

所以我想念这里。

【问题讨论】:

  • 因为a*也匹配空,所以它显示一个空结果
  • a* 匹配。它匹配零个“a”。
  • @catcon 谢谢,我已经转移到preg_match_all,现在我得到了存储在数组中的每一步的结果

标签: php regex


【解决方案1】:

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

/a*/ 匹配 0 个或多个 a 字符。在字符串的开头和第一个 b 之间有 0 个 a 字符,所以它在那里匹配。

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

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

【讨论】:

【解决方案2】:

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

希望对你有所帮助。

【讨论】:

  • 非常感谢,这行让match string which may NOT contain a更清楚了,与@JGNI的答案相结合。谢谢你们俩
  • @MohamedOmar 欢迎随时欢迎!)
  • 我认为如果我们说(匹配任何nothing或a)会更准确。因为如果匹配任何可能不包含的字符串,就意味着匹配任何东西,比如 b.
  • 在您在这里显示的结果中,没有返回任何内容,如果有则返回,但仅此而已
【解决方案3】:

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

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

还有a* 匹配空,这就是它显示空结果的原因。您可以使用preg_match_all("/a*/", 'bbba',$o);,然后对结果数组的非空值进行过滤。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-04
    • 2021-06-27
    • 1970-01-01
    • 2014-08-16
    • 2011-04-08
    • 2012-11-24
    • 2013-06-05
    • 2021-09-29
    相关资源
    最近更新 更多