繁体   English   中英

正则表达式在 Java 中的 Json 值中转义双引号

[英]Regex to escape double quote in a Json Value in Java

我有一个 JSON 字符串,它可能在 JSON 值部分有未转义的双引号字符。 我试图使用正则表达式捕获它们并使用java.util.regex.Matcher转义,然后将完整的 JSON 字符串转换为com.fasterxml.jackson.databind.node.ObjectNode对象。 以便,

这变成:

{
  "DESC1":"Steve"s and Carl"s " Car",
  "DESC2": "Steve's and Carl"s Car",
  "DESC3": """,
  "DESC4": "Steve and Carl"
}

这个

{
  "DESC1":"Steve\"s and Carl\"s \" Car",
  "DESC2": "Steve's and Carl\"s Car",
  "DESC3": "\"",
  "DESC4": "Steve and Carl"
}

到目前为止,我能够想到遵循正则表达式(我不是专家),但它并不是针对所有 3 种情况。

:\s*"(.*(").*)"

如何改进这个正则表达式?

对于示例数据,您可以匹配键部分,并在值部分使用\\G来获取重复匹配,以断言前一个匹配结束时的位置。

为了确保至少有一个开始和结束的花括号,您可以使用环视 Java 不支持无限回溯,但通过为量词指定一个数字来支持有限回溯。

在此示例中,我选择了{0,1000}但您当然可以根据需要更改它。

(?<=\\{[^\\{}]{0,1000})("[^\r\n"{}]+":\s*"|\G(?!^))([^"\r\n{}]*)(")(?=[^{}]*})(?!\s*(?:,|$))

在 Java 中

final String regex = "(?<=\\{[^\\{}]{0,1000})(\"[^\\r\\n\"\\{}]+\":\\s*\"|\\G(?!^))([^\"\\r\\n\\{}]*)(\")(?=[^\\{}]*\\})(?!\\s*(?:,|$))";

在替换中使用 3 个捕获组:

String subst = "$1$2\\\\$3";

Java 演示

图案零件

  • (?<=有限正向后视,断言左边的是
    • {[^{}]{0,1000}匹配{后跟 0 - 1000 次不是{}
  • )关闭后视
  • (捕获组 1
    • "[^\\r\\n"{}]+"匹配" , 1+ 任何字符,除了字符类中的字符
    • :\\s*"匹配: , 0+ 空格字符
    • | 或者
    • \\G(?!^)在上一场比赛结束时断言位置
  • )关闭群组
  • ([^"\\r\\n{}]*)捕获组 2 ,匹配除所列字符以外的任何字符 0+ 次
  • (")捕获第 3 组,匹配"
  • (?=正向前瞻,断言右边是
    • [^{}]*}匹配 0+ 次除列出的字符之外的任何字符,然后匹配}
  • )关闭前瞻
  • (?!负前瞻,断言右边的不是
    • \\s*(?:,|$)匹配 0+ 次空白字符,然后匹配,或字符串的结尾
  • )关闭前瞻

结果

{
  "DESC1":"Steve\"s and Carl\"s \" Car",
  "DESC2": "Steve's and Carl\"s Car",
  "DESC3": "\"",
  "DESC4": "Steve and Carl"
}

如果这个值字符串;

str = str.replaceAll("\/","");

使“/”变成“”(空)。

或者

try {
     FileReader reader = new FileReader("JSON file path");
     JSONParser jsonParser = new JSONParser();
     String jsonString = jsonParser.parse(reader).toString();
} catch (Exception e) {
     e.printStackTrace();
}

对于 JSONParser

<dependency>
    <groupId>com.googlecode.json-simple</groupId>
    <artifactId>json-simple</artifactId>
    <version>1.1.1</version>
</dependency>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM