【问题标题】:What's the best way to replace double quotes only once?只替换一次双引号的最佳方法是什么?
【发布时间】:2015-10-07 18:08:42
【问题描述】:

我有一个字符串,其中可能包含双引号。我知道我可以通过将“替换为\”来转义字符串,例如:

myString.value.replace(/\"/g, "\\\"");

但是这样做会产生另一个问题,如果某些双引号已经被转义。例如,如果我的字符串中已经有 \",运行它会将其更改为 \",这是我不想要的。

有没有办法忽略已经转义的双引号,只替换那些不是的?

【问题讨论】:

标签: javascript regex


【解决方案1】:

您可以使用replace 来回调:

var s = s = 'abc "def" \\"foo bar\\" 123';
var r = s.replace(/(\\*)"/g, function($0, $1) {return ($1.length % 2) ? $0 : '\\' + $0; });
//=> abc \"def\" \"foo bar\" 123

更多测试:

> 'ab"c'.replace(/(\\*)"/g, function($0, $1) {return ($1.length % 2) ? $0 : '\\' + $0;}); 
"ab\"c"

> 'ab\\"c'.replace(/(\\*)"/g, function($0, $1) {return ($1.length % 2) ? $0 : '\\' + $0;}); 
"ab\"c"

> 'ab\\\\"c'.replace(/(\\*)"/g, function($0, $1) {return ($1.length % 2) ? $0 : '\\' + $0;}); 
"ab\\\"c"

> 'ab\\\\\\"c'.replace(/(\\*)"/g, function($0, $1) {return ($1.length % 2) ? $0 : '\\' + $0;}); 
"ab\\\"c"

> 'ab\\\\\\\\"c'.replace(/(\\*)"/g, function($0, $1) {return ($1.length % 2) ? $0 : '\\' + $0;}); 
"ab\\\\\"c"

【讨论】:

  • 您没有计算反斜杠,因此,在奇数个反斜杠上,您最终会转义反斜杠并使引号未转义。
  • 请提供示例输入
  • 对您的示例进行简单修改:'abc "def" \\"foo bar\" 123'
  • 在原始示例中,您将所有\" 替换为\\",正确的转义将是\\\"(或者如果您不关心反斜杠,则只需\")。您可以在我修改后的示例中看到,您的代码在使用单个反斜杠的情况下执行相同的操作。
  • 好的,我明白了。我本来没有打算解决多个反斜杠的情况。无论如何,在您发表评论后,我重新编写了正则表达式并提供了许多示例。
【解决方案2】:

碰巧,字符串中的引号转义问题有一个内置的解决方案,因此您不需要自己实现解析器。只需使用JSON.stringify :)

你会得到你的字符串,带有正确转义的引号和反斜杠,它周围有双引号,你可能想要也可能不想修剪。

JSON.stringify("\\\"")
=> "\"\\\"\""

【讨论】:

    【解决方案3】:

    所以只转义未转义的引号:

    myString.value.replace(/[^\\]\"/g, "\\\"");
    

    【讨论】:

    • \\\" 怎么样? (这是一个转义的反斜杠,后跟一个转义的引号)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-08
    • 2011-11-07
    • 2015-12-31
    • 1970-01-01
    • 2019-04-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多