Difference between $1 and $& in regular expression

2020-03-12 07:17发布

I have stumbled upon $& when I use regular expressions. If I use $1 I get the same result as with $&. What is special with $&, and where is it documented?

When I search for "regular expression +$&" on duckduckgo or google I can't find any relevant matches.

In the example below it is possible to use $1 or $&. What is special about $&, and why does it exist?

See a fiddle with the example

<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条回答
等我变得足够好
2楼-- · 2020-03-12 08:03

$& returns the entire matched string while $1, $2, ... returns the captured match. I know it sounds odd, but see perlre for more info.

Consider the following:

'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
查看更多
▲ chillily
3楼-- · 2020-03-12 08:07

$& is a "replacement" (placeholder for something to be substituted in) for the full match (all the matched text). $1 is a "replacement" for the first capture group.

So:

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

gives us

testt

because the $& is st and the $1 is t.

查看更多
戒情不戒烟
4楼-- · 2020-03-12 08:11

The $& and $1 are not the same.

You get the same value because you enclosed the whole pattern in a capturing group.

The $& is a backreference to the whole match, while $1 is a backreference to the submatch captured with capturing group 1.

See MDN String#replace() reference:

$&               Inserts the matched substring.
$n or $nn  Where n or nn are decimal digits, inserts the nth parenthesized submatch string, provided the first argument was a RegExp object.

More details on replacement backreferences can be found at regular-expressions.info.

查看更多
登录 后发表回答