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>
$&
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:
$&
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:
gives us
because the
$&
isst
and the$1
ist
.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:More details on replacement backreferences can be found at regular-expressions.info.