如何使用Java中的regex捕获图括号内的键/值?

时间:2017-04-05 20:54:46

标签: java regex regex-group

我在Java中有一个字符串,如:

 String whatIHaveToMatch = "$item1$={key1=1,key2=2,key3=3,}"+
                           "$item2$={key10=4,key11=5,key3=4,key9=7,}"+
                           "$itemN$={keyi-1=5,keyi=3,}";

如何定义模式以使每个组都包含项目和每个键/值相关联?

更新

我必须构建一个HashMap<String,HashMap<String,Integer>> 其中外部HashMap的每个entryKey都是一个项目的标识符,并返回内部&#34;键&#34; /&#34;值&#34;的地图。

&#34;键&#34;(在这个例子中:key1,key2,key3 ......)没有特定的形式,它们可以是字母数字。

2 个答案:

答案 0 :(得分:1)

正则表达式是错误的工具。你需要一个简单的解析器。 如果这是您需要解析的唯一数据格式,那么您可以编写一些自定义代码来解析您的字符串。如果您需要解析一系列格式,那么像JavaCC或Antlr这样的东西可能会更好。

答案 1 :(得分:1)

这可以用正则表达式完成:

String string = "$item1$={key1=1,key2=2,key3=3,}"+
                   "$item2$={key10=4,key11=5,key3=4,key9=7,}"+
                   "$itemN$={keyi-1=5,keyi=3,}";
HashMap<String,HashMap<String,Integer>> myMap = new HashMap<String,HashMap<String,Integer>>();
Pattern itemPattern = Pattern.compile("([^\\s{}]+)=\\{([^{}]+)\\}");
Matcher itemMatcher = itemPattern.matcher(string);
while(itemMatcher.find()) {
    HashMap<String,Integer> item = new HashMap<String,Integer>();
    String itemName = itemMatcher.group(1);
    String itemContent = itemMatcher.group(2);
    Pattern kvPattern = Pattern.compile("([^=,]+)=([^=,]+)");
    Matcher kvMatcher = kvPattern.matcher(itemContent);
    while(kvMatcher.find()) {
        item.put(kvMatcher.group(1), Integer.parseInt(kvMatcher.group(2)));
    }
    myMap.put(itemName, item);
}
System.out.println(myMap.toString());

但要非常小心。正如kimbert所说,regexp不是这类工作的正确工具。