使用星号*量词的奇怪结果

问题描述 投票:1回答:2

我想在一个简单的字符串练习星号*量词,但同时,我只有两个字母,结果包含第三场比赛。

<?php
$x = 'ab';

preg_match_all("/a*/",$x,$m);
echo '<pre>';
var_dump($m);
echo '</pre>';
?>

结果出来了:

 array(1) {
  [0]=>
    array(3) {
     [0]=> string(1) "a"
     [1]=> string(0) ""
     [2]=> string(0) ""
    }
 }

我的理解是第一相匹配的则没有符合当b,所以结果应该是

  array(1) {
  [0]=>
    array(2) {
     [0]=> string(1) "a"
     [1]=> string(0) ""
    }
 }

那么,什么是第三场比赛?

php regex pcre
2个回答
2
投票

从使用一个正则表达式的演示工具here,我们可以看到,在第一匹配是a,而第二和第三匹配是在ab之间的零名宽度的分隔符,并且还在b和字符串的端部之间。

请记住,preg_match_all的行为是反复取图案a*并尝试按顺序将其应用到整个输入字符串。

我怀疑你真的想在这里用的是a+。如果你研究这个second demo,你会看到与a+我们只得到一个匹配,在aab信。所以,我投用a+这里解决您的问题。


0
投票

你正则表达式“/ A / *”匹配零(空)或更多的连续a字符。

例如:如果你试图匹配“/ A * /”空字符串,它将返回一个匹配,因为*是指没有以上。 see here

在preg_match_all继续寻找,直到finishning处理整个字符串。一旦找到匹配,它remainds字符串尝试和应用其他比赛。

© www.soinside.com 2019 - 2024. All rights reserved.