2011-01-14 73 views
3

我指的代碼Case insensitive string replacement in JavaScript?

RegExp.escape = function(str) 
{ 
    var specials = new RegExp("[.*+?|()\\[\\]{}\\\\]", "g"); // .*+?|()[]{}\ 
    return str.replace(specials, "\\$&"); 
} 

是什麼\\$&意思?

我認爲\\逃脫\字符。然後$&,我認爲應該是$1匹配第一場比賽? tho $1不能正常工作

回答

4

$&表示與正則表達式匹配的整個(子)字符串,與捕獲組無關。您得到的替換結果是您的字符串中的每個匹配字符都會被文字反斜線(由\\表示)轉義。由於這裏使用的正則表達式只包含一個字符類,「每個匹配」指的是匹配的字符類中列出的每個元字符。

例如,正則表達式串[abc]將與\[abc\]取代:當它在字符類發生

  • [匹配。通過$&代表,替換\[

  • abc不在字符類的元字符,所以當它在字符類時他們忽略

  • ]匹配。通過$&代表,替換\]

0

$&是整個匹配,在示例中是無論哪個特殊字符匹配。 $1不起作用,因爲在正則表達式中沒有組(...)(儘管如果您在方括號周圍添加了括號,那麼它也會起作用)。

是的,第一個'\'轉義另一個(通常反斜槓與以下字符一起使用以賦予其特殊含義,因此要獲得文字反斜槓,需要使用另一個反斜槓進行轉義)。

0

這正則表達式是不使用捕獲組。顯然,他是使用一個共同的正則表達式變量:

$& returns the entire matched string (some systems its $0)
在這種情況下,他只是在相當於s/[.*+?|()\[\]{}\\]/\\$&/g 時間匹配1個字符

暗紋的事實:在Perl有一個函數調用quotemeta(「你字符串「),它可以這樣做
或者它可以用\ Q在正則表達式中內聯。我喜歡Perl。

作爲一個便箋,他可能已經遺漏了底座^並且可能但不確定的是,沒有內置或內聯方法的事實可能是一件壞事。像這樣逃脫metachars必須考慮出來,因爲正則表達式片段可能有問題。