$ 1和$&之间的差异在正则表达式中

时间:2015-12-29 12:08:05

标签: javascript regex

当我使用正则表达式时,我偶然发现了$&。如果我使用$1,我会得到与$&相同的结果。 $&的特殊内容以及记录在哪里

当我搜索“正则表达式+ $&”时在duckduckgo或谷歌我找不到任何相关的匹配。

在下面的示例中,可以使用$1$&。有什么关于$&和它为什么存在?

使用示例

查看fiddle
<div id="quotes">
  <ul>
    <li>Поехали!
      <ul>
        <li><b>Let's go!</b></li>
        <li>Variant translations: <b>Let's ride!</b></li>
        <li><b>Let's drive!</b></li>
        <li><b>Off we go!</b></li>
      </ul>
    </li>
  </ul>
  <ul>
    <li><i>Облетев Землю в корабле-спутнике, я увидел, как прекрасна наша планета. Люди, будем хранить и преумножать эту красоту, а не разрушать её!</i>
      <ul>
        <li><b>Orbiting Earth in the spaceship, I saw how beautiful our planet is. People, let us preserve and increase this beauty, not destroy it!</b></li>
      </ul>
    </li>
  </ul>
</div>

<script>
    var quotes = document.getElementById("quotes"),
        html   = quotes.innerHTML,
        match  = /(let)/gi;

    // $1 gives same result
    quotes.innerHTML = html.replace(match, "<mark>$&</mark>");
</script>

3 个答案:

答案 0 :(得分:5)

$&$1不一样。

您获得的值相同,因为您将整个模式包含在捕获组中。

$&是对整个匹配的反向引用,而$1是对捕获组1捕获的子匹配的反向引用。

请参阅MDN String#replace() reference

  

$&插入匹配的子字符串。
  $n$nn其中nnn为十进制数字,请插入n带括号的子匹配字符串,前提是第一个参数为RegExp对象

有关replacement backreferences can be found at regular-expressions.info的更多详情。

答案 1 :(得分:3)

$&返回整个匹配的字符串,$1$2,...返回捕获的匹配项。我知道这听起来很奇怪,但请参阅perlre for more info

请考虑以下事项:

'abc abc'.replace(/(a)(b)./g, '$1'); // a a
'abc abc'.replace(/(a)(b)./g, '$2'); // b b
'abc abc'.replace(/(a)(b)./g, '$&'); // abc abc

答案 2 :(得分:2)

$&是&#34;替代品&#34; 完全匹配(所有匹配的文本)(要替换的内容的占位符)。 $1是&#34;替代品&#34;对于第一个捕获组。

所以:

var str = "test".replace(/s(t)/, "$&$1");

给我们

testt

因为$&st$1t