如何在JavaScript中转义和取消引用?

Emi*_* A. 5 javascript regex string replace

这是一段很短的代码:

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);
Run Code Online (Sandbox Code Playgroud)

我希望这段代码能够正常运行,但结果却收到了:

hi \" | hi \"
Run Code Online (Sandbox Code Playgroud)

如果我将unescapeQuotes方法中新的RegExp构造函数的第一个参数更改为4个反斜杠,则一切都按预期开始工作.

string.replace(new RegExp('\\\\"', 'g'),'"');
Run Code Online (Sandbox Code Playgroud)

结果:

hi \" | hi " 
Run Code Online (Sandbox Code Playgroud)

为什么需要四个反斜杠作为新RegExp构造函数的第一个参数?为什么它只与其中2个一起使用?

T.J*_*der 14

问题是你正在使用RegExp构造函数,它接受一个字符串,而不是使用正则表达式文字.所以在你的unescape的这一行:

return string.replace(new RegExp('\\"', 'g'),'"');
Run Code Online (Sandbox Code Playgroud)

... \\由JavaScript解析器解释为处理字符串的部分,导致将单个反斜杠传递给正则表达式解析器.所以正则表达式解析器看到的表达式是\".反斜杠也是正则表达式中的一个转义字符,但\"并不代表任何特殊的东西,只是最终存在".要在正则表达式中有一个实际的反斜杠,你必须有两个; 要在字符串文字中执行此操作,您必须有四个(因此它们可以在两个解释层中存活).

除非你有充分的理由使用RegExp构造函数(例如,你必须使用一些不同的输入),所以总是使用文字形式:

var utility = {
    escapeQuotes: function(string) {
        return string.replace(/"/g, '\\"');
    },
    unescapeQuotes: function(string) {
        return string.replace(/\\"/g, '"');
    }
};
Run Code Online (Sandbox Code Playgroud)

它不那么令人困惑.