【问题标题】:Difference between $1 and $& in regular expressions正则表达式中 $1 和 $& 的区别
【发布时间】:2015-12-29 12:08:04
【问题描述】:

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

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

在下面的示例中,可以使用$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>

【问题讨论】:

  • $1 = 第一组匹配的内容。 $&amp; = 整个正则表达式匹配的内容。
  • 在哪里可以了解 $& 的工作原理? (文档)
  • @emanciperingsivraren 在MDN page about replace
  • @emanciperingsivraren,你可以谷歌regex "$&amp;" vs "$1" :)
  • @ndn,我希望我知道我必须在 $& 和 1 周围使用引号才能得到我正在寻找的答案:) 没有它,谷歌不明白我想要它寻找什么。

标签: javascript regex


【解决方案1】:

$&amp;$1 不一样。

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

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

见 MDN String#replace() reference:

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

更多详情请关注replacement backreferences can be found at regular-expressions.info

【讨论】:

  • 请注意,$&amp; 是一个方便的构造,当您需要从替换模式中引用整个匹配文本时,它允许您不使用模式内的任何捕获组。在大多数语言(不是 Perl!)中,您可以安全地使用 &amp;$ 并省略外部未转义的括号。
【解决方案2】:

$&amp;完全匹配(所有匹配的文本)的“替换”(要替换的内容的占位符)。 $1 是第一个捕获组的“替换”。

所以:

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

给我们

测试

因为$&amp;st$1t

【讨论】:

  • $&amp;$n 不是占位符,而是反向引用。
  • @stribizhev:不在replace 他们不是。他们被称为"replacements"。反向引用将在 in 正则表达式中,而 JavaScript 没有它们。
  • @T.J.Crowder:根据regular-expressions.info,它们是替换反向引用。
  • @stribizhev:当谈到事物的规范名称时,我将通过一些随机网站获取规范。 :-)
  • 嗯,反向引用与占位符非常相似。只是占位符代表一些硬编码(静态)文本,而反向引用指向动态子字符串,一旦找到匹配项就会被初始化。我刚刚想到了这个:)
【解决方案3】:

$&amp; 返回整个匹配的字符串,而$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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-07
    • 2016-11-18
    • 2012-02-22
    • 2023-04-07
    • 2013-06-05
    • 2021-10-01
    • 2016-03-12
    • 2012-06-01
    相关资源
    最近更新 更多