如何替换正则表达式的捕获组?

4
在一个字符串中,我需要将所有出现的 [A]"A"'A'_A_ 替换为 [X]"X"'X'_X_。我尝试过这个答案,但结果奇怪(代码如下)。我使用 new RegExp 是因为它允许插入一个变量 -- 这里 AX 只是举例子。
// 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
为了避免像 pointy pointed (*g*) 所指出的问题,应该使用正则表达式字面量语法而不是构造函数。 - Christoph
@Pointy 只有在方括号前面加倍反斜杠 才能生效!-- 但是其他位置加倍会导致语法错误,只是作为记录。 - João Souza
@Christoph 我认为在正则表达式字面量中插值变量是不可能的。就像我说的,2和X只是例子。实际值在一个变量中,所以我需要使用构造函数。 - João Souza
1个回答

6

这个问题是由两层反斜杠解释引起的。首先,你需要理解JavaScript的字符串字面量语法,它使用反斜杠来转义字符。当你有一个像这样的字符串:

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

在您的代码中,实际内容为:

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

这段代码首先被正则表达式构造器解析,它把[)(A)('|"|_|]看作一个字符类,等同于[A'"_()|]

如果想让正则表达式引擎识别反斜杠,你需要在字符串中输入两个反斜杠。

你也可以使用字符类来简化代码:

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接