Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何替换RegExp捕获组?_Javascript_Regex - Fatal编程技术网

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中变量,所以我需要构造函数。