为什么以下代码:
<?php echo preg_replace("/(.*)/", "$1.def", "abc");
输出abc.def.def
而不是abc.def
?
我很想知道重复发生的原因。
使用/(.+)/
或/^(.*)$/
按预期工作,但我不是在寻找解决方案,只是提出问题(尽管这些模式可能与答案有关)。
使用实时版here修补。
答案 0 :(得分:8)
因为.*
匹配字符串末尾的空子字符串。这意味着字符串abc
有两个匹配项:
abc
→abc.def
.def
给出了abc.def.def
。
编辑 String.replaceAll() anomaly with greedy quantifiers in regex 中解释了原因的详细说明。
答案 1 :(得分:3)
这是预期的行为:https://bugs.php.net/bug.php?id=53855
这是预期的行为,没有PHP特有的。 * 量词允许在你的结尾发生“空”匹配 主题字符串。
答案 2 :(得分:2)
如果你让你的正则表达式非贪婪,/(.*?)/
你可以看到整个重复过程的工作范围更大/更明显:
.defa.defb.defc.def
你得到四场比赛:a,b,c,empty
。然而,正如其他人提到的那样,使用贪婪的正则表达式,你得到2个匹配,完整的字符串和空字符串。