我在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 ......)没有特定的形式,它们可以是字母数字。
答案 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不是这类工作的正确工具。