使用反斜杠转义字符串中的引号

时间:2011-09-11 23:51:39

标签: javascript regex escaping

我有一个字符串:" \" "。我想逃避所有未转义的双引号,即在"之前添加一个反斜杠,如果有的话。

input = '" \\" "'
input.replace(???) == '\\" \\" \\"'

我试过

input.replace(/(?!\\)"/g, '\\"')

由于我不理解的原因,它会两次反复使用反斜杠('\" \\" \"')。

我已经想通了

(' ' + input).replace(/([^\\])"/g, '$1\\"').slice(1)

但它看起来很难看。它必须是一种更好的方式。


更新

又一个测试用例:

>> input = '" \\" \\\\" \\\\\\"'
-> '" \" \\" \\\"'
>> input.replace(???)
-> '\" \" \\\" \\\"'

我的正则表达式都无法处理它。

3 个答案:

答案 0 :(得分:3)

我所拥有的几乎没有更好,但它确实处理了逃逸的反斜杠:

>>> var v= 'a\\"b'
>>> v
"a\"b"
>>> v.replace(/(\\*)(")/g, function(x) { var l = x.length; return (l % 2) ? x : x.substring(0,l-1) + '\\"' } )
"a\\"b"
>>> var v= 'a\\\\"b'
>>> v
"a\\"b"
>>> v.replace(/(\\*)(")/g, function(x) { var l = x.length; return (l % 2) ? x : x.substring(0,l-1) + '\\"' } )
"a\\"b"

如果在引用(1,3,5)之前存在奇数数字的斜杠,则报价已经转义;需要逃避的偶数(包括零)。

通过在输入中转义斜线以及着色器无法理解正则表达式表达式所需的内容更加难以阅读......

当然,你甚至可能不应该这样做。如果你有一个原始字符串,并且你需要传递给某些内容(例如)eval,请考虑$.toJSON

答案 1 :(得分:2)

这对我有用:

var arf = input.replace(/(^|[^\\])"/g, '$1\\"');

它说,替换一个引号,当前面是字符串开头或任何其他反斜杠,反斜杠后跟引号。

答案 2 :(得分:0)

String(str).replace(/[\\"']/g, "\\$&")
   .replace(/[\r\n\u2028\u2029]/g,
   function (x) {
     switch (x) {
     case '\n': return "\\n";
     case '\r': return "\\r";
     case '\u2028': return "\\u2028";
     case '\u2029': return "\\u2029";
     }
   })

String调用可确保输入为有效字符串。

第一个替换将处理引号和反斜杠。第二个处理嵌入式行终止符。

如果您想处理已经引用的字符串,可以将第一个替换为:

'"' + String(str).replace(/^"|"$/g, "").replace(/[\\"]/g, "\\$&") + '"'

取消引用并重新引用。