正则表达式以转义Java中Json值中的双引号
我有一个JSON字符串,它的JSON值部分可能包含未替换的双引号字符。我试图使用正则表达式捕获它们,并使用正则表达式以转义Java中Json值中的双引号,java,json,regex,Java,Json,Regex,我有一个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": """,
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"
}
这个
到目前为止,我能够想到以下正则表达式(我不是专家),但它不是针对所有的3个案例
:\s*"(.*(").*)"
如何改进此正则表达式?如果此值为字符串
str = str.replaceAll("\/","");
使“/”更改“(空)
或
对于JSONParser
<dependency>
<groupId>com.googlecode.json-simple</groupId>
<artifactId>json-simple</artifactId>
<version>1.1.1</version>
</dependency>
com.googlecode.json-simple
简单json
1.1.1
对于示例数据,您可以匹配关键部分,并在值部分使用\G
获得重复匹配,以确定上一次匹配结束时的位置
为了确保至少有一个开口和一个闭合的卷括号,您可以使用。Java不支持无限查找,但is通过为量词指定一个数字来支持有限查找
在本例中,我选择了{01000}
,但您当然可以根据自己的需求更改它
(?<=\\{[^\\{}]{0,1000})("[^\r\n"{}]+":\s*"|\G(?!^))([^"\r\n{}]*)(")(?=[^{}]*})(?!\s*(?:,|$))
图案部分
(?
…那么它是无效的JSON,并且不可能由任何Java JSON库生成。这个损坏的JSON的来源是什么,为什么你不能在那里修复它?如果没有嵌套的大括号,也许这可以工作我有一个JSON字符串,它可能有未替换的双引号字符
<dependency> <groupId>com.googlecode.json-simple</groupId> <artifactId>json-simple</artifactId> <version>1.1.1</version> </dependency>
(?<=\\{[^\\{}]{0,1000})("[^\r\n"{}]+":\s*"|\G(?!^))([^"\r\n{}]*)(")(?=[^{}]*})(?!\s*(?:,|$))
final String regex = "(?<=\\{[^\\{}]{0,1000})(\"[^\\r\\n\"\\{}]+\":\\s*\"|\\G(?!^))([^\"\\r\\n\\{}]*)(\")(?=[^\\{}]*\\})(?!\\s*(?:,|$))";
String subst = "$1$2\\\\$3";
{ "DESC1":"Steve\"s and Carl\"s \" Car", "DESC2": "Steve's and Carl\"s Car", "DESC3": "\"", "DESC4": "Steve and Carl" }