Javascript(Regex):我如何替换(反斜杠+双引号)对?

时间:2016-09-20 02:30:21

标签: javascript regex double-quotes backslash

在Javascript中,我想要以下原始字符串:

  

我想替换\"这个\"并且\"那个"单词,但不是那个"这里"

..变得像:

  

我想替换^ this ^和^那个^词,但不是那个"这里"

我尝试过类似的事情:

var str = 'I want to replace \"this\" and \"that\" words, but NOT the one "here"';
str = str.replace(/\"/g,"^");
console.log( str );

演示:JSFiddle here

但仍 ..输出为:

  

我想替换^ this ^和^那^字,但不是^ ^ ^

这意味着我只想替换\"次出现,而不仅仅取代"。但我不能。

请帮忙。

3 个答案:

答案 0 :(得分:2)

作为@ adeneo的评论,您的字符串创建错误,并不完全符合您的期望。请试试这个:

var str = 'I want to replace \\"this\\" and \\"that\\" words, but not the one "here"';
str = str.replace(/\\\"/g,"^");
console.log(str);

答案 1 :(得分:1)

您可以使用RegExp /(")/String.prototype.lastIndexOf()String.prototype.slice()来检查匹配的字符是否为输入字符串中的最后一个或倒数第二个匹配。如果为true,则返回原始匹配,否则将匹配替换为"^"字符。

var str = `I want to replace \"this\" and \"that\" words, but NOT the one "here"`;

var res = str.replace(/(")/g, function(match, _, index) {
  return index === str.lastIndexOf(match) 
         || index === str.slice(0, str.lastIndexOf(match) -1)
                      .lastIndexOf(match)
         ? match
         : "^"
});
console.log(res);

答案 2 :(得分:0)

String.prototype.replace的问题在于它只替换没有正则表达式的第一次出现。要解决此问题,您需要添加g和RegEx的结尾,如下所示:

var mod = str => str.replace(/\\\"/g,'^');
mod('I want to replace \\"this\\" and \\"that\\" words, but NOT the one "here"');

一个效率较低但更容易理解的做法是用分隔符拆分字符串,然后将其与替换符号连接起来,如下所示:

var mod = str => str.split('\\"').join('^');
mod('I want to replace \\"this\\" and \\"that\\" words, but NOT the one "here"');

注意:您可以使用'或'包装字符串。假设您的字符串包含“,即a”a,您需要在“"a"a"导致语法错误之前放置\。 'a"a'不会导致语法错误,因为解析器知道“是字符串的一部分,但当你在其前面放一个\”或任何其他特殊字符时,它意味着后面的字符是一个特殊字符。所以'a\"a' === 'a"a' === "a\"a"。如果你想存储\,你需要使用\,无论你使用什么类型的引用,所以要存储\“,你需要使用'\\"''\\\"'"\\\""