【问题标题】:Escape quotes in a string with backslash使用反斜杠转义字符串中的引号
【发布时间】:2011-11-14 23:26:34
【问题描述】:

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

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

我试过了

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

由于我不明白的原因,它两次转义了第二个反斜杠 ('\" \\" \"')。

我想通了

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

但它看起来很丑。它必须是一个更好的方法。


更新:

另外一个测试用例:

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

我的正则表达式都不能处理它。

【问题讨论】:

  • JS 不支持lookbehinds,但我正在尝试模仿它们。 [^\] 无法编译(抛出 SyntaxError)。
  • 啊抱歉,我猜是我弄糊涂了 ;) 对,\ 也是表达式中的转义字符。抱歉...删除了我的评论,因为它根本没有意义...
  • 无论如何,反斜杠被转义了,因为虽然\" 不匹配," 匹配。由于您的表达式未锚定,因此会尝试匹配每个位置/字符。

标签: javascript regex escaping


【解决方案1】:

我所拥有的几乎没有更好,但它也可以处理转义的反斜杠:

>>> 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"

如果引号前有 odd 个斜杠 (1, 3, 5),则引号已被转义;偶数(包括零),需要转义。

由于需要转义输入中的斜杠以及着色器无法理解正则表达式,使得阅读变得更加困难......

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

【讨论】:

  • 应该是function(x, y) {var l = y.length;
  • 不,应该是function(all, backslashes, quote) {return backslashes.length % 2 ? all : backslashes + '\\' + quote}。无论如何感谢您的提示。
【解决方案2】:

这对我有用:

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

它说,当引号前面是字符串开头或反斜杠以外的任何内容时,用反斜杠后跟引号替换引号。

【讨论】:

  • 它完成了我最初的要求,但它不处理我刚刚添加的测试用例。
  • 它准确地回答了你的问题,所以你改变了问题。我明白了。
【解决方案3】:
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, "\\$&") + '"'

取消引用和重新引用。

【讨论】:

  • 采用原始输入,您的代码生成 '\" \\\" \"' 而不是 '\" \" \"'
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-14
相关资源
最近更新 更多