[英]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";
图案零件
(?<=
有限正向后视,断言左边的是
{[^{}]{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.