5

如果我在我的正则表达式中输入 *,它就不起作用,如果我输入 +,它就起作用。

*应该表示 0 或更多,+应该表示 1 或更多。


带 * 的情况

$num = '    527545855   ';
var_dump( preg_match( '/\d*/', substr( $num, 0, 18 ), $coincidencias ) );
var_dump($coincidencias);exit;

结果:

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

带 + 的情况

$num = '    527545855   ';
var_dump( preg_match( '/\d+/', substr( $num, 0, 18 ), $coincidencias ) );
var_dump($coincidencias);exit;

结果:

int(1)
array(1) {
  [0]=>
  string(9) "527545855"
}

我认为两者都应该工作,但我不明白为什么 * 不起作用。

4

5 回答 5

7

*表示 0 次或多次出现,因此第一次出现是测试字符串中的 void 字符串

于 2013-05-30T13:35:38.467 回答
4

引擎将从索引 0 开始尝试匹配。

  • 由于\d*可以匹配空字符串,因此引擎将返回索引 0 处的空字符串。
  • 相反,\d+必须匹配至少一个数字,并且由于量词是贪婪的,它将返回最接近的数字序列,同时尽可能多的数字(在您的情况下,它是输入字符串中的整个数字序列) .
于 2013-05-30T13:37:48.983 回答
4

您在问题中回答了这个问题:

* should mean 0 or more, + should mean 1 or more.

它匹配的第一件事是0个或多个数字。

于 2013-05-30T13:38:03.403 回答
3

它会匹配数字或什么都不匹配

\d*表示匹配 0到多个数字


例如在

hello 123

正则表达式\d*

将匹配8 次,即 1 在 start( ^) ,6 次 forhello和 1 次 for123

于 2013-05-30T13:40:01.937 回答
2

正则表达式中的*in 获取它之前的字符并查找 0 个或更多实例。正则表达式中的+in 查找 1 个或多个实例。

由于您并没有真正检查数字(关心其他项目),因此您将从正则表达式中获得更多项目,*因为它允许满足 0 实例子句,这对数字之前的所有空格都有效(a space 匹配数字的 0 个实例)。+确保至少找到一个。

于 2013-05-30T13:41:04.497 回答