首页 > 解决方案 > Java - 使用多正则表达式从字符串中提取 JSON 值

问题描述

我正在尝试使用这个多正则表达式 java 库从字符串中提取 JSON 字段值。

我的 JSON 看起来像这样:

{
  "field1": "something",
  "field2": 13
  "field3": "some"
}

我创建了一个正则表达式模式来适应每个字段,它通过简单地为每个模式执行类似的操作来使用 Java 正则表达式模式:

Matcher matcher = patternToSearch.matcher(receiveData);
        if (matcher.find()) {
            return matcher.group(1);
        }

我决定尝试改进代码并使用多正则表达式,而不是扫描字符串 3 次,它只会扫描一次并提取所有需要的值。

所以我想出了这样的事情:

String[] patterns = new String[]{
                    "\"field1\":\\s*\"(.*?)\"",
                    "\"field2\":\\s*(\\d+)(\\.\\d)?",
                    "\"field3\":\\s*\"(.*?)\"",
            };
            this.matcher = MultiPattern.of(patterns).matcher();

matcher只有一种方法——match像这样使用:

int[] match = this.matcher.match(jsonStringToScan);

所以我最终得到了一个整数列表,但我不知道如何从这些字符串中获取 json 值以及这些整数如何帮助我。多正则表达式matcher不支持group我之前使用的获取值的方法。

知道如何使用多正则表达式从字符串中提取多个 json 值吗?(只扫描一次字符串)

标签: javaregex

解决方案


您的链接中的 github 页面 match所述,返回匹配模式的索引。此页面的另一点:

该库不处理组。

也考虑将键匹配为组。看这个简单的例子:

    final Pattern p = Pattern.compile("\"(field.)\":((?:\".*?\")|(?:\\d+(?:\\.\\d+)?))");
    final Matcher m = p.matcher("{\"field3\":\"hi\",\"field2\":100.0,\"field1\":\"hi\"}");
    while (m.find()) {
        for (int i = 1; i <= m.groupCount(); i++) {
            System.out.print(m.group(i) + " ");
        }
        System.out.println();
    }

它打印:

field3 "hi" 
field2 100.0 
field1 "hi" 

如果要避免值组中的引号,则需要更复杂的逻辑。我停在:

        final Pattern p = Pattern.compile("\"(field.)\":(?:(?:\"(.*?(?=\"))\")|(\\d+(?:\\.\\d+)?))");

导致

field3 hi null 
field2 null 100.0 
field1 hi null 

推荐阅读