在一个字符串,我需要更换的所有出现[A],"A",'A'并_A_有[X],"X",'X'和_X_。我试过这个答案,但它给出了一个奇怪的结果(下面的代码)。我使用的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
Run Code Online (Sandbox Code Playgroud)
问题是由反斜杠经历的两层解释引起的。首先你有 JavaScript 的字符串文字语法,它使用反斜杠来转义字符。当你有一个像
'(\'|\"|\_|\[)(A)(\'|\"|\_|\])'
Run Code Online (Sandbox Code Playgroud)
在您的代码中,实际内容是:
('|"|_|[)(A)('|"|_|])
Run Code Online (Sandbox Code Playgroud)
然后由 RegExp 构造函数解析它,该构造函数将其视为[)(A)('|"|_|]等效于 的单个字符类[A'"_()|]。
要保留反斜杠以便正则表达式引擎可以看到它,您必须在字符串中放置两个反斜杠。
您还可以使用字符类来稍微简化您的代码:
'(\'|\"|\_|\[)(A)(\'|\"|\_|\])'
Run Code Online (Sandbox Code Playgroud)