【问题标题】:How can I replace two double quotes with one double quotes using Regex without capturing occurrences of one double quote?如何使用正则表达式用一个双引号替换两个双引号而不捕获一个双引号的出现?
【发布时间】:2018-05-18 04:46:19
【问题描述】:

我正在尝试替换 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"

【问题讨论】:

  • 编写您自己的自定义 JSON 解析器,忽略不正确的双引号:P

标签: javascript json regex string replace


【解决方案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。谢谢!

【讨论】:

  • 我建议改用([^:]")"+。它依次捕获超过2个"的可能性,您只需替换为$1
【解决方案2】:

这样的事情应该可以工作。

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

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

【讨论】:

    【解决方案3】:

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

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

    我也会尝试找出为什么我的 json 格式错误:-)

    更好:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-04
      • 1970-01-01
      • 2014-10-05
      • 1970-01-01
      相关资源
      最近更新 更多