PHP正则表达式(+和*之间的不同结果)

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

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

为什么要使用 substr?你可以直接传递 $num - nhahtdh
4
尝试使用 preg_match_all(),看看会发生什么... - Tim Pietzcker
@TimPietzcker 感谢您的提示!我现在看到所有的出现了。 - JorgeeFG
5个回答

7
* 表示0个或多个出现,因此在您的测试字符串中,第一次出现是空字符串。

4

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

  • 由于\d*可以匹配空字符串,因此引擎将在索引0处返回空字符串。
  • 相比之下,\d+必须至少匹配一个数字,并且由于量词是贪婪的,它将返回最近的数字序列,同时尽可能多地取用数字(在您的情况下,是输入字符串中的整个数字序列)。

4
你在问题中已经回答了这个问题:
* 应该表示0或多个,+应该表示1或多个。
它匹配的第一件事是0个或多个数字。

3

这将匹配数字或

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


例如在

hello 123

正则表达式\d*

将匹配8次,即1次在开头(^),6次为hello,1次为123


2
在正则表达式中,*表示匹配前面的字符0次或多次。而+则表示匹配前面的字符1次或多次。
由于你并不是真正地检测数字周围的内容(关心其他项目),所以使用*会从正则表达式中获取更多的项,因为它允许满足0实例条款,这对于数字之前的所有空格都是有效的(一个空格匹配0个数字)。+确保至少找到一个数字。

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