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引用中所述)。我猜它在那里是用来做一些高级正则表达式的钩子的