正则表达式以转义Java中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": """,

我有一个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"
}
这个

到目前为止,我能够想到以下正则表达式(我不是专家),但它不是针对所有的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字符串,它可能有未替换的双引号字符
    …那么它是无效的JSON,并且不可能由任何Java 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"
    }