在字符串中,我需要替换所有出现的 [A]
、"A"
、'A'
和 _A_
与 [X]
、“X”
、'X'
和 _X_
。我试过 this answer但它给出了一个奇怪的结果(下面的代码)。我使用 new RegExp
,因为它允许插入一个变量——A
和 X
只是一个例子。
// 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
最佳答案
问题是由反斜杠经历的两层解释引起的。首先你有 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'));
关于javascript - 如何替换 RegExp 捕获组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43965113/