2015-12-29 79 views
6

我在使用正則表達式時偶然發現了$&。如果我使用$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

'$ 1' =第一組匹配的是什麼。 '$&'=整個正則表達式匹配的是什麼。 – ndn

+0

我在哪裏可以讀到$&如何工作? (文檔) – emanciperingsivraren

+1

@emanciperingsivraren在[MDN頁面上關於'replace'](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace#Specifying_a_string_as_a_parameter)。 – Xufox

回答

4

$&$1是不一樣的。

因爲您將整個模式包含在捕獲組中,所以您可以獲得相同的值。

$&是反向引用整個比賽,而$1是反向引用到子匹配與捕獲組1

見MDN String#replace() reference捕獲:

  $&                            插入匹配的子字符串。
$n$nn    凡nnn是十進制數字,插入n個括號子匹配串,所提供的第一個參數是一個RegExp對象。

有關replacement backreferences can be found at regular-expressions.info的更多詳細信息。

+0

請注意'$&'是一個方便的構造,當您需要引用替換模式中的全部匹配文本時,您可以不使用模式中的任何捕獲組。在大多數語言中(不是Perl!),您可以放心地使用這個'&$'並省略外部未轉義的括號。 –

2

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

$&是爲全場比賽(所有匹配的文本)「替代」(佔位符某事進行替代)。 $1是第一個捕獲組的「替代品」。

所以:

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

給我們

 
testt 

因爲$&st$1t

+0

'$&'和'$ n'不稱爲佔位符,而是反向引用。 –

+1

@stribizhev:不是'替換'他們不是。他們被稱爲[「替換」](http://www.ecma-international.org/ecma-262/6.0/index.html#sec-string.prototype.replace)。反向引用會在正則表達式中*,並且JavaScript沒有它們。 –

+0

@ dev-null:Stoopid編輯錯誤,謝謝! –

相關問題