如何在 Java 中使用正则表达式捕获图形括号内的 key/value?
How to capture key/value inside graph parenthesis with regex in Java?
我在 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,}";
我如何定义一个模式来让每个组都包含项目并且每个 key/value 关联?
更新:
我必须建立一个 HashMap<String,HashMap<String,Integer>>
其中外部HashMap的每个entryKey是一个item的标识符,returns内部"key"/"value".
的Map
"keys"(在这个例子中:key1,key2,key3...)没有特定的形式,它们可以是字母数字。
正则表达式是错误的工具。你需要一个简单的解析器。
如果这是您需要解析的唯一数据格式,那么您可以编写一些自定义代码来解析您的字符串。如果您需要解析一系列格式,那么像 JavaCC 或 Antlr 这样的东西可能会更好。
这是用正则表达式完成的工作:
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 所说,正则表达式不是这类工作的正确工具。
我在 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,}";
我如何定义一个模式来让每个组都包含项目并且每个 key/value 关联?
更新:
我必须建立一个 HashMap<String,HashMap<String,Integer>>
其中外部HashMap的每个entryKey是一个item的标识符,returns内部"key"/"value".
"keys"(在这个例子中:key1,key2,key3...)没有特定的形式,它们可以是字母数字。
正则表达式是错误的工具。你需要一个简单的解析器。 如果这是您需要解析的唯一数据格式,那么您可以编写一些自定义代码来解析您的字符串。如果您需要解析一系列格式,那么像 JavaCC 或 Antlr 这样的东西可能会更好。
这是用正则表达式完成的工作:
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 所说,正则表达式不是这类工作的正确工具。