Php 为什么preg_替换为字符串的/(.*)/重复部分?
为什么会出现以下代码:Php 为什么preg_替换为字符串的/(.*)/重复部分?,php,regex,preg-replace,Php,Regex,Preg Replace,为什么会出现以下代码: <?php echo preg_replace("/(.*)/", "$1.def", "abc"); 因为*匹配字符串末尾的空子字符串。这意味着字符串有两个匹配项abc: 整个字符串abc→ abc.def 空字符串→ .def 它给出了abc.def.def 编辑:中详细解释了发生这种情况的原因。这是预期的行为: 这是预期的行为,不是PHP特有的。* 量词允许在语句末尾出现“空”匹配 主题字符串 如果你让你的正则表达式不贪婪,/(.*)/你可以看到整个重复过
<?php echo preg_replace("/(.*)/", "$1.def", "abc");
因为*
匹配字符串末尾的空子字符串。这意味着字符串有两个匹配项abc
:
整个字符串abc
→ <代码>abc.def
.def
abc.def.def
编辑:中详细解释了发生这种情况的原因。这是预期的行为: 这是预期的行为,不是PHP特有的。* 量词允许在语句末尾出现“空”匹配 主题字符串
如果你让你的正则表达式不贪婪,
/(.*)/
你可以看到整个重复过程在更大/更明显的范围内工作:
.defa.defb.defc.def
您将得到四个匹配项:a、b、c、
空。然而,正如其他人所提到的,使用贪婪的正则表达式,您会得到两个匹配项,一个是完整字符串,一个是空字符串。更简单的测试用例相关:为什么它第一次不匹配整个字符串?如果在javascript中运行“a”.replace(/.*/,“b”)
,则会得到预期的b
。如果我在php中使用preg\u replace(/.*/,“b”,“a”)
,我会得到bb
@Eric:“a”。replace(/.*/g,“b”)
。奇怪的预期行为。我本以为*
匹配会消耗尽可能多的资源,包括末尾的任何空字符串。在该空字符串之后是否没有空字符串?:)哎呀!我忘了这一点。@SirDarius:“a”.gsub(/.*/,'b')
但是为什么贪婪的版本不将整个内容作为匹配项—包括空字符串?因为当它开始匹配某个内容时(在本例中为“abc”),它不能将空字符串“添加”到非空字符串中。然而,一旦使用非空字符串,它就可以匹配空字符串。很抱歉听到这个消息,伙计。。。但话说回来,正则表达式可能很神秘。因为它像Highlander,所以只能有一个。@trapper我认为这是正则表达式的定义行为,即在主题字符串的末尾提供一个空字符串(如@dAm2K引用中所述)。我猜它在那里是用来做一些高级正则表达式的钩子的