Java 正则表达式将字符串转换为有效的 json 字符串

Posted

技术标签:

【中文标题】Java 正则表达式将字符串转换为有效的 json 字符串【英文标题】:Java regex convert string to valid json string 【发布时间】:2017-05-15 06:54:09 【问题描述】:

我有一个很长的字符串,看起来像

abc:\"def\", ghi:\"jkl\"

我想将其转换为有效的 json 字符串,例如

\"abc\":\"def\", \"ghi\":\"jkl\"

我开始查看字符串对象上的replaceAll(String regex, String replacement) 方法,但我正在努力为它找到正确的正则表达式。

谁能帮帮我。

【问题讨论】:

另一种方法是使用宽松的解析器来解析它,例如Gson 有一个setLenient() 方法。然后将其写回为有效的 JSON。 您使用的是哪个 json 依赖项?更好的选择是根据正确的格式生成它,无论是客户端还是服务器端 您可以尝试通过搜索一系列标识符字符后跟: 来进行替换,但如果任何值字符串中有冒号,这可能会让您失望。其他可能打败你的事情是其中一个值中的转义引号。可能会想出一个复杂的正则表达式来处理所有事情,但在这种情况下,最好编写自己的词法分析器来处理输入中的标记(如:,、标识符、字符串文字)并从中工作。过于复杂的正则表达式不可读且容易出错。 【参考方案1】:

在这种特殊情况下,regex 应该查找以space, 开头且后面不跟" 的单词

String str = "abc:\"def\", ghi:\"jkl\"";
String regex = "(?:[ ,])(\\w+)(?!\")";
System.out.println(str.replaceAll(regex, "\\\"$1\\\""));

DEMO和regex解释

【讨论】:

【参考方案2】:

我必须假设“键”和“值”仅包含 “单词字符”(\w),其中没有空格。

这是我的程序。另请参阅 cmets in-line:

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RegexJson 

    public static void main(String[] args) 
        /*
         * Note that the input string, when expressed in a Java program, need escape
         * for backslash (\) and double quote (").  If you read directly
         * from a file then these escapes are not needed
         */
        String input = "abc:\\\"def\\\", ghi:\\\"jkl\\\"";

        // regex for one pair of key-value pair.  Eg: abc:\"edf\"
        String keyValueRegex = "(?<key>\\w+):(?<value>\\\\\\\"\\w+\\\\\\\")";
        // regex for a list of key-value pair, separated by a comma (,) and a space ( )
        String pairsRegex    = "(?<pairs>(,*\\s*"+keyValueRegex+")+)";
        // regex include the open and closing braces ()
        String regex         = "\\"+pairsRegex+"\\";

        StringBuilder sb = new StringBuilder();

        sb.append("");
        Pattern p1 = Pattern.compile(regex);
        Matcher m1 = p1.matcher(input);
        while (m1.find()) 
            String pairs = m1.group("pairs");
            Pattern p2 = Pattern.compile(keyValueRegex);
            Matcher m2 = p2.matcher(pairs);
            String comma = "";      // first time special
            while (m2.find()) 
                String key      = m2.group("key");
                String value    = m2.group("value");
                sb.append(String.format(comma + "\\\"%s\\\":%s", key, value));
                comma = ", ";       // second time and onwards
            
        
        sb.append("");

        System.out.println("input is: " + input);
        System.out.println(sb.toString());
    


这个程序的打印输出是:

input is: abc:\"def\", ghi:\"jkl\"
\"abc\":\"def\", \"ghi\":\"jkl\"

【讨论】:

以上是关于Java 正则表达式将字符串转换为有效的 json 字符串的主要内容,如果未能解决你的问题,请参考以下文章

有一串json字符串,我需要将其中的时间格式从yyyy-M-d转换为yyyy/M/d,用c#的正则表达式替换的方法怎么写

正则表达式查找部分输入是不是为有效 JSON

如何将 Java 字符串转换为模式正则表达式?

在正则表达式 C# 中转换 json 的最有效方法

如何使用 Python 将任何字符串转换为有效的自定义模式?

将java字符串转换为与replaceAll中的正则表达式兼容的字符串[重复]