Javascript 如何替换RegExp捕获组?
在字符串中,我需要将所有出现的Javascript 如何替换RegExp捕获组?,javascript,regex,Javascript,Regex,在字符串中,我需要将所有出现的[a]、“a”、'a'和\u a替换为[X]、“X”、'X'。我试过了,但结果很奇怪(代码如下)。我使用newregexp,因为它允许插入变量--a和X只是一个例子 // CAPTURE GROUPS: |------1-----|2|-----3------| var regexp = new RegExp('(\'|\"|\_|\[)(A)(\'|\"|\_|\])', 'g') var string = ' [A] _A_ "A" \'A\' A
[a]
、“a”
、'a'
和\u a
替换为[X]
、“X”
、'X'
。我试过了,但结果很奇怪(代码如下)。我使用newregexp
,因为它允许插入变量--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'”|()|]
等效的单个字符类
要保留反斜杠以便regexp引擎可以看到它,必须在字符串中放置两个反斜杠
您还可以使用字符类稍微简化代码:
var regex=new RegExp('([\'“\[])A([\'“\\]]),'g')
变量字符串='[A]\U A\U“A”\'A\'A BAB“B”'
console.log(string.replace(regex,$1X$2'));
当您从这样的字符串构建正则表达式时,反斜杠转义字符必须加倍。为了防止指针(*g*)指向out,使用Regex-literal语法,而不是构造函数。@只有在方括号起作用之前才将反斜杠加一倍!--但将其他两倍会产生语法错误,仅供记录。@Christoph我认为不可能在Regex-literal中插入变量。正如我所说,2和X只是示例。实际值在va中变量,所以我需要构造函数。