这是一段简短的代码:
var utility = {
escapeQuotes: function(string) {
return string.replace(new RegExp('"', 'g'),'\\"');
},
unescapeQuotes: function(string) {
return string.replace(new RegExp('\\"', 'g'),'"');
}
};
var a = 'hi "';
var b = utility.escapeQuotes(a);
var c = utility.unescapeQuotes(b);
console.log(b + ' | ' + c);
我希望这段代码能够正常运行,但结果却收到了:
hi \" | hi \"
如果我将unescapeQuotes方法中新的RegExp构造函数的第一个参数更改为4个反斜杠,一切都会按预期开始工作。
string.replace(new RegExp('\\\\"', 'g'),'"');
结果:
hi \" | hi "
为什么需要四个反斜杠作为新RegExp构造函数的第一个参数?为什么它只适用于其中两个呢?
答案 0 :(得分:13)
问题是你正在使用RegExp
构造函数,它接受一个字符串,而不是使用正则表达式文字。所以在你的unescape中的这一行:
return string.replace(new RegExp('\\"', 'g'),'"');
... JavaScript解析器将\\
解释为处理字符串的部分,从而将单个反斜杠传递给正则表达式解析器。所以正则表达式解析器看到的表达式是\"
。反斜杠也是正则表达式中的转义字符,但\"
并不代表任何特殊内容,只是最终成为"
。要在正则表达式中有一个实际的反斜杠,你必须有两个;要在字符串文字中执行此操作,您必须具有四(因此它们可以在两个解释层中存活)。
除非您有充分的理由使用RegExp
构造函数(例如,您必须使用某些不同的输入),否则请始终使用文字形式:
var utility = {
escapeQuotes: function(string) {
return string.replace(/"/g, '\\"');
},
unescapeQuotes: function(string) {
return string.replace(/\\"/g, '"');
}
};
它不那么令人困惑。