我正在尝试编写代码以遵循某种模式从字符串中提取某些值。基本上是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及所有内容的解决方案。那不是我需要的解决方案。
答案 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”的部分您将其用作地图的键。您可能想重新考虑一下您的命名约定和方法,因为这可能会使将来的人们更难阅读代码。