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

9

这是一段简短的代码:

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方法中new RegExp构造函数的第一个参数改为4个反斜杠,那么一切都会按照预期工作。

string.replace(new RegExp('\\\\"', 'g'),'"');

结果如下:
hi \" | hi " 

为什么在使用new RegExp构造函数作为第一个参数时需要使用四个反斜杠?为什么只使用两个反斜杠不行?


在大多数情况下,包括您的情况在内,不应使用原始构造函数。您应该执行/\\"/g而不是 new RegExp('\\"', 'g'),以避免由构造函数引起的意外奇怪字符串解释(和返回值不正确)。 - Derek 朕會功夫
1个回答

24

问题在于您正在使用RegExp构造函数,该函数接受一个字符串,而不是使用正则表达式字面量。因此,在您的反转义中的这一行:

return string.replace(new RegExp('\\"', 'g'),'"');

在JavaScript中,\\被解释为字符串的一部分,这会导致正则表达式解析器只接收到一个反斜杠。因此,正则表达式解析器看到的表达式是\"。反斜杠也是正则表达式中的转义字符,但\"并没有特殊意义,最终会变成"。要在正则表达式中使用实际的反斜杠,需要输入两个反斜杠;要在字符串字面量中实现这一点,则需要输入四个反斜杠(以便在两层解释之后还剩下两个)。

除非你有非常好的理由使用RegExp构造函数(例如必须使用某些变化的输入),否则请始终使用字面形式。

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

这样就简单明了多了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接