正则表达式中$1和$&的区别

14

在使用正则表达式时,我发现了$&。如果我使用$1,我会得到与$&相同的结果。那么$&有什么特别之处,并且在哪里有记录

当我在duckduckgo或谷歌上搜索"regular expression +$&"时,找不到相关的匹配项。

在下面的示例中,可以使用$1$&$&有什么特殊之处,为什么它存在?

参见此处具有示例

<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>

1
$1 = 第一组匹配到的内容。$& = 整个正则表达式所匹配到的内容。 - ndnenkov
我在哪里可以阅读有关$&如何工作的文档? - emanciperingsivraren
1
@emanciperingsivraren 在MDN关于replace的页面上。 - Sebastian Simon
1
@emanciperingsivraren,你可以谷歌搜索“正则表达式"$&" vs "$1"` :) - ndnenkov
@ndn,我希望我知道我需要在$&和1周围使用引号才能得到我想要的答案 :) 如果没有它,谷歌就不明白我想要搜索什么。 - emanciperingsivraren
3个回答

12

$&$1并不相同。

你得到相同的值是因为你将整个模式都放在了一个捕获组中。

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

请参考MDN String#replace()的文档

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

更多关于替换反向引用的详细信息可以在regular-expressions.info中找到


请注意,$& 是一个方便的结构,允许您在替换模式中引用整个匹配文本时不使用任何捕获组。在大多数语言(不包括 Perl!)中,您可以安全地使用 &$ 并省略外部未转义的括号。 - Wiktor Stribiżew

7

$&是“替换”(用于替换的占位符)完整匹配文本。 $1是第一个捕获组的“替换”。

因此:

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

给予我们

测试

因为$&st$1t


1
$&$n不被称为占位符,而是反向引用。 - Wiktor Stribiżew
1
@stribizhev:在“replace”中并不是这样。它们被称为“替换”("replacements")(http://www.ecma-international.org/ecma-262/6.0/index.html#sec-string.prototype.replace)。反向引用将在正则表达式内部,而JavaScript没有它们。 - T.J. Crowder
1
根据regular-expressions.info的说法,它们是替换后向引用。 - Wiktor Stribiżew
@stribizhev:当涉及到事物的规范名称时,我会选择规范文件而不是一些随意的网站。 :-) - T.J. Crowder
回溯引用(backreferences)和占位符(placeholder)非常相似。占位符代表一些硬编码(静态)的文本,而回溯引用指向动态子字符串,在找到匹配项后初始化。我刚想到这个 :) - Wiktor Stribiżew

5

$& 返回整个匹配的字符串,而 $1$2 等返回捕获到的匹配项。

考虑以下示例:

'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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接