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

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


但是这样做会带来另一个问题,如果某些双引号已被转义。例如,如果我的字符串中已经有\“,运行此命令会将其更改为\”,这是我不希望的。

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

最佳答案

您可以将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"

关于javascript - 最好只替换一次双引号的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32999451/

10-13 00:46