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

omhiaaxx  于 2023-02-10  发布在  其他
关注(0)|答案(3)|浏览(258)

我在使用正则表达式时偶然发现了$&。如果我使用$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>
5tmbdcev

5tmbdcev1#

$&$1不相同。
因为您将整个模式包含在一个捕获组中,所以会得到相同的值。
$&是对整个匹配的反向引用,而$1是对使用捕获组1捕获的子匹配的反向引用。
参见MDN String#replace() reference
$& 插入匹配的子字符串。
$n$nn 其中nnn是十进制数字,如果第一个参数是RegExp对象,则插入第n个带括号的子匹配字符串。
关于replacement backreferences can be found at regular-expressions.info的更多详细信息。

x7rlezfr

x7rlezfr2#

$&是 * 完全匹配 *(所有匹配文本)的"替换"(要替换内容的占位符)。$1是第一个捕获组的"替换"。
因此:

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

给了我们

testt

因为$&st并且$1t

pkwftd7m

pkwftd7m3#

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

相关问题