
PHP正则表达式中的+含义及贪婪/非贪婪匹配
在PHP正则表达式中,+符号表示匹配前面字符出现一次或多次。 然而,+本身并不直接代表贪婪或非贪婪匹配。 贪婪与否取决于正则表达式引擎的默认行为以及是否使用了非贪婪修饰符?。
PHP的preg_*函数系列默认使用贪婪匹配。 贪婪匹配是指正则表达式引擎会尝试匹配尽可能多的字符,直到匹配失败为止。 非贪婪匹配则相反,它会尝试匹配尽可能少的字符,满足条件即停止。
示例:
立即学习“PHP免费学习笔记(深入)”;
代码:
$name = "abc:def:ghi";
preg_match('/^[^\:]++(\:[^\:]++)*$/', $name, $matches);
print_r($matches);
$text = "abca";
preg_match('/.*?a/', $text, $matches1);
preg_match('/.*+a/', $text, $matches2);
echo "\n非贪婪匹配结果:";
print_r($matches1);
echo "\n贪婪匹配结果:";
print_r($matches2);
解释:
-
^[^\:]++(\:[^\:]++)*$:这个正则表达式中,+匹配一个或多个非冒号字符。由于没有?修饰符,它采用默认的贪婪匹配。(\:[^\:]++)*部分则匹配零个或多个以冒号开头,后跟一个或多个非冒号字符的子串。 -
/.*?a/:这个正则表达式使用?修饰符,使*变为非贪婪匹配,因此它匹配尽可能少的字符,直到遇到第一个"a"。 -
/.*+a/:这个正则表达式采用默认的贪婪匹配,它会匹配尽可能多的字符,直到遇到最后一个"a"。
总结:
+本身仅表示“一个或多个”,而贪婪或非贪婪是由正则表达式引擎的默认行为(PHP默认贪婪)和?修饰符决定的。 要实现非贪婪匹配,需要在量词(如*、+、?、{n,m})后面添加?。











