正则表达式只有一场比赛

时间:2020-04-01 07:56:45

标签: java regex

我正在尝试编写代码以遵循某种模式从字符串中提取某些值。基本上是json中的键和值,其中值包含在 {{value}}

在以下代码中:

String jsonString = "{\"title\":\"{{string_64|dsm_title}}\",\"code\":\"{{string_16|dsm_code}}\",\"enabled\":true,\"enableAdvanceFilter\":false,\"deleteAfterScheduledTime\":false,\"enableDataStoreLog\":false}";
        String patternString = "[\"](?<key>.*)[\"][:][? ]?.*[{][{](?<value>.*)[}][}]";
        Pattern pattern = Pattern.compile(patternString);
        Matcher matcher = pattern.matcher(jsonString);
        HashMap<String, Object> allMatches = new HashMap<>();
        while (matcher.find()) {
            allMatches.put(matcher.group("value"), matcher.group("key"));
        }
        System.out.println(allMatches);

我期望输出为:

string_64|dsm_title -> title
string_16|dsm_code -> code

但是它给我的输出是:

string_16|dsm_code -> title":"{{string_64|dsm_title}}","code

请帮助我纠正正则表达式。 请不要提供有关将其解析为json及所有内容的解决方案。那不是我需要的解决方案。

1 个答案:

答案 0 :(得分:1)

由于您正在使用的是JSON,因此您应该真正使用JSON解析器将JSON字符串转换为对象或地图,这些解析器内置了将JSON字符串转换为地图的功能-很好的例子是GSON和Java自己的JSON解析器。现在,正如您常说的那样,您正在“重新发明轮子”,通过编写别人已经编写的代码来增加复杂性,这可能比RegEx方法的效率要高得多。了解如何使用Jackson here

之类的东西从JSONObject转到地图

但是,如果您确实要使用RegEx来解决此问题,则可以使用类似于(?>\\\")(?<key>.*?)(?>\\\":\\\"\\{\\{)(?<value>.*?)(?>\\}\\}\\\")的RegEx。您可以看到它与您的代码here一起使用。因为您是直接在示例中打印地图,所以这将为您提供输出{string_64|dsm_title=title, string_16|dsm_code=code}

如果摘录的链接对您不起作用,则直接更改您给定的代码:

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

class Main {
  public static void main(String[] args) {
    String jsonString = "{\"title\":\"{{string_64|dsm_title}}\",\"code\":\"{{string_16|dsm_code}}\",\"enabled\":true,\"enableAdvanceFilter\":false,\"deleteAfterScheduledTime\":false,\"enableDataStoreLog\":false}";
    String patternString = "(?>\\\")(?<key>.*?)(?>\\\":\\\"\\{\\{)(?<value>.*?)(?>\\}\\}\\\")";

    Pattern pattern = Pattern.compile(patternString);
    Matcher matcher = pattern.matcher(jsonString);

    HashMap<String, Object> allMatches = new HashMap<>();
    while (matcher.find()) {
      allMatches.put(matcher.group("value"), matcher.group("key"));
    }

    System.out.println(allMatches);
  }
}

让我感到困惑的是,您在RegEx中命名为“键”的部分(随后使用)和地图中的 value ,以及在RegEx中命名为“ value”的部分您将其用作地图的。您可能想重新考虑一下您的命名约定和方法,因为这可能会使将来的人们更难阅读代码。