2017-05-14 104 views
-1

在一個字符串,我需要[X]"X"'X'_X_更換的[A]"A"'A'_A_所有出現。我試過this answer,但它給出了一個奇怪的結果(下面的代碼)。我使用new RegExp,因爲它允許插入一個變量 - AX只是一個例子。如何替換RegExp捕獲組?

// CAPTURE GROUPS:  |------1-----|2|-----3------| 
var regexp = new RegExp('(\'|\"|\_|\[)(A)(\'|\"|\_|\])', 'g') 
var string = ' [A] _A_ "A" \'A\' A BAB "B" ' 
string.replace(regex, '$1X$3') 

// ORIGINAL: [A] _A_ "A" 'A' A BAB "B" 
// EXPECTED: [X] _X_ "X" 'X' A BAB "B" 
// ACTUAL: [X] XXX XXX XXX X BXB XBX 
+2

當你從構建這樣的字符串正則表達式,反斜槓轉義字符必須**翻番**。 – Pointy

+0

爲了防止指出(\ * g \ *)指出什麼,使用正則表達式文字語法而不是構造函數。 – Christoph

+0

@只在方括號**工作之前,@加倍反斜槓**! - 但是加倍其他人給出語法錯誤,只是爲了記錄。 –

回答

2

該問題是由反斜槓經歷的兩層解釋引起的。首先,您使用JavaScript的字符串文字語法,它使用反斜槓來轉義字符。當您在代碼中有一個像

'(\'|\"|\_|\[)(A)(\'|\"|\_|\])' 

一個字符串,實際內容是:

('|"|_|[)(A)('|"|_|]) 

這隨後被RegExp的構造函數,它把[)(A)('|"|_|]作爲單個字符類相當於[A'"_()|]解析。

要保留一個反斜槓以便正則表達式引擎可以看到它,必須在您的字符串中放置兩個反斜槓。

您還可以使用字符類來簡化你的代碼位:

var regex = new RegExp('([\'"_[])A([\'"_\\]])', 'g') 
 
var string = ' [A] _A_ "A" \'A\' A BAB "B" ' 
 
console.log(string.replace(regex, '$1X$2'));

+0

多麼美妙的答案。感謝您的所有細節。 –