2017-05-14 8 views
-1

は、私が[X]"X"'X'_X_[A]"A"'A'_A_のすべての出現箇所を交換する必要があります。私はthis answerを試しましたが、それは奇妙な結果(下のコード)を与えています。変数AXを補間できるので、new RegExpを使用しています。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

pointy(\ * g \ *)を指摘するのを避けるには、コンストラクタの代わりにRegexのリテラル構文を使用してください。 – Christoph

+0

**角括弧**が動作する前にバックスラッシュ**を2倍にします。 - しかし、他のものを倍にすると、レコードのためだけに構文エラーが発生します。 –

答えて

2

問題は、バックスラッシュが受ける解釈の2つのレイヤーによって発生します。まず、JavaScriptの文字列リテラル構文を使用します。これはバックスラッシュを使用して文字をエスケープします。あなたのコードで

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

のような文字列を持っている場合は、実際の内容は以下のとおりです。

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

これは、その後[A'"_()|]と同等の単一の文字クラスとして[)(A)('|"|_|]を扱うのRegExpコンストラクタによって解析されます。

正規表現エンジンで認識できるようにバックスラッシュを維持するには、文字列に2つのバックスラッシュを付ける必要があります。あなたがそのような文字列から正規表現を構築する場合、バックスラッシュ文字をエスケープ

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

+0

すてきな答え。すべての詳細をありがとうございます。 –

関連する問題