如何使用Regex将两个双引号替换为一个双引号而不捕获一个双引号的出现?

时间:2017-12-04 16:47:49

标签: javascript json regex string replace

我正在尝试对JSON字符串进行替换。像这样:

'{"val1":"1","val2":"2"","val3":"","val4":""}'

查看与关键"val2"相关联的值,我得到两个双引号" 2 " ",但我无法解决这个问题,因为这就是我得到JSON的方式,我我试图用1个双引号替换这些事件:从"2"""2"

我正在做replace(),但我找不到合适的正则表达式。我试过这个:

replace(/""/g, '"')

如果我这样做,它也会替换"val3""val4"

这个不起作用:

replace(/[^:]+"";/g, '"')

我正在努力完成replace(REGEX_HERE): 从"SomeCharactersHere"""SomeCharactersHere"

3 个答案:

答案 0 :(得分:1)

你试过了吗?

var s = '{"val1":"1","val2":"2"","val3":"","val4":""}';
s = s.replace(/([^:])\"\"/g, '$1\"')
console.log(s);

这匹配一些非冒号字符,后跟一组双引号,并将其替换为最初找到的非冒号字符以及单双引号。

根据ctwheels的建议:

var s = '{"val1":"1","val2":"2"","val3":"","val4":""}';
s = s.replace(/([^:]")"+/g, '$1')
console.log(s);

如上所述,它将捕获多个无关双引号的可能性,并将替换简化为$1。谢谢!

答案 1 :(得分:0)

我会在匹配部分添加逗号。

'{"val1":"1","val2":"2"","val3":"","val4":""}'.replace(/"",/g, '\",');

我还想弄清楚为什么我的格式很糟糕的json: - )

更好的是:

'{"val1":"1","val2":"2"","val3":"","val4":""}'.replace(/"\([^"]+\)""/g, '"\1"')

答案 2 :(得分:0)

这样的事情应该有效。



const str = '{"val1":"1","val2":"2"","val3":"","val4":""}';
const cleaned = str.replace(/(\"+([^",]*)\"+)/g, (match,quotes,val) => `"${val}"`);
console.log(cleaned);
console.log(JSON.parse(cleaned));




基本上,它会匹配每个引号块(包括额外的引号),然后将其重写为只有一对引号。

请注意:如果您的值包含逗号,则无法正常工作。这是对这种特殊方法的限制。如果您需要值中的逗号,则可以使用此备用正则表达式:

/(\"([^"]*)\"+)/g

那个将用于逗号,但如果你在字符串的开头有一个双引号就不会工作。在这种情况下,您必须将+转移到第一个。