Javascript 如果我使用变量而不是直接使用相应的字符串,为什么这个正则表达式不起作用?

Javascript 如果我使用变量而不是直接使用相应的字符串,为什么这个正则表达式不起作用?,javascript,regex,Javascript,Regex,这是我的代码: function escape(str) { return str.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\\\$&'); } function replace(str, needle, replacement) { var expr = '([^\\[]*)(' + escape(needle) + ')([^\\]]*)'; return str.replace(new RegExp(expr, 'g')

这是我的代码:

function escape(str) {
  return str.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\\\$&');
}

function replace(str, needle, replacement) {
  var expr = '([^\\[]*)(' +
      escape(needle) + ')([^\\]]*)';
  return str.replace(new RegExp(expr, 'g'), '$1' + replacement + '$3');
}

document.body.innerHTML += replace('hello() [hello()] test()', '()', '@');
问题在于以下几行:

var expr = '([^\\[]*)(' +
  escape(needle) + ')([^\\]]*)';
如果我用

var expr = '([^\\[]*)(' +
  '\\(\\)' + ')([^\\]]*)';
它起作用了。我不明白为什么不能使用
escape
函数的返回值。我的意思是,如果我用

alert(escape('()'));
我犯了什么错

不工作的小提琴:

工作小提琴:

问题来自
escape
函数
'\\\\$&'
中的双反斜杠被转义,您不需要转义它,因为它只需要像
'\$&'
一样转义一次。所以改变转义函数给了我预期的结果

function escape(str) {
  return str.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&');
}

问题来自于在
escape
函数
'\\\$&'
中转义的双反斜杠。您不需要转义它,因为它只需要像
'\\$&'
那样转义一次。所以改变转义函数给了我预期的结果

function escape(str) {
  return str.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&');
}

看来你把你的反斜杠的逃逸搞混了

您需要以字符串文字转义反斜杠,因为反斜杠也用于转义其他字符。这意味着字符串文本
'\\'
存储为
\
,如下所示:


console.log('\\')看来你把反斜杠的转义搞混了

您需要以字符串文字转义反斜杠,因为反斜杠也用于转义其他字符。这意味着字符串文本
'\\'
存储为
\
,如下所示:


console.log('\\')
您不必转义
[]
字符组中的大多数特殊字符。它也不起作用。
escape
函数来自stackoverflow应答。它可以工作,但不知何故不能与我的其他代码结合使用。请参阅我附加的小提琴。@Anonymous抱歉,我误读了您的正则表达式,似乎您正在双重跳过替换占位符(
\\\\$&
),使其更改模式(改为
\\(\\)
,而不是
\(\)
不再匹配括号。我已更新答案您不必转义
[]中的大多数特殊字符
字符组。它也不起作用。
转义
函数来自stackoverflow答案。它起作用,但不与我的其他代码结合使用。请参阅我附加的小提琴。@Anonymous抱歉,我误读了您的正则表达式,似乎您正在双重跳过替换占位符(
\\\$&
)使其更改模式(改为
\\(\\)
,而不是
\(\)
不再匹配括号。我更新了正则表达式中的答案,您只需要一个反斜杠来转义字符。您添加了两个反斜杠(
'\\$&'
)(在您的工作示例中,字符串文字
\(\\)
存储为
\(\)
@Ivar谢谢,我已经开始发疯了。你应该把这个作为答案发布,因为这正是我问题的解决方案。在正则表达式中,你只需要一个反斜杠就可以转义一个字符。你正在添加两个反斜杠(
'\\$&'
)(在你的工作示例中,字符串文字
\\(\\)
存储为
\(\)
@Ivar谢谢,我已经开始发疯了。你应该将此作为答案发布,因为这正是我问题的解决方案。