正则表达式以分割key = value

我有一个像这样的字符串:

KEY1=Value1, KE_Y2=[V@LUE2A, Value2B], Key3=, KEY4=V-AL.UE4, KEY5={Value5} 

我需要将其拆分以获得具有键值对的Map。 []值应作为单个值传递( KE_Y2是键, [V@LUE2A, Value2B]是一个值)。

我应该用什么正则表达式正确分割它?

第一次拆分有一个神奇的正则表达式:

 String[] pairs = input.split(", *(?![^\\[\\]]*\\])"); 

然后用简单的“=”分割每个键/值:

 for (String pair : pairs) { String[] parts = pair.split("="); String key = parts[0]; String value = parts[1]; } 

把它们放在一起:

 Map map = new HashMap(); for (String pair : input.split(", *(?![^\\[\\]]*\\])")) { String[] parts = pair.split("="); map.put(parts[0], parts[1]); } 

瞧!


魔法正则表达式的解释:

正则表达式说“一个逗号后跟任意数量的空格(所以键名没有前导空格),但只有遇到下一个括号不是一个紧密的括号”

这个怎么样:

 Map map = new HashMap(); Pattern regex = Pattern.compile( "(\\w+) # Match an alphanumeric identifier, capture in group 1\n" + "= # Match = \n" + "( # Match and capture in group 2: \n" + " (?: # Either... \n" + " \\[ # a [ \n" + " [^\\[\\]]* # followed by any number of characters except [ or ] \n" + " \\] # followed by a ] \n" + " | # or... \n" + " [^\\[\\],]* # any number of characters except commas, [ or ] \n" + " ) # End of alternation \n" + ") # End of capturing group", Pattern.COMMENTS); Matcher regexMatcher = regex.matcher(subjectString); while (regexMatcher.find()) { map.put(regexMatcher.group(1), regexMatcher.group(2)); } 

从@ achintya-jha的回答开始。 当你拆分一个String时,它会给你一个数组(或类似它的东西),所以你可以遍历这对键/值,然后你做第二次拆分,它应该给你另一个大小为2的数组; 然后使用第一个元素作为键,第二个元素作为值。

编辑:

我在JAVA中没有找到有用的链接(请参阅问题的评论)(虽然它有很多用于C / C ++)所以我写了它:

 Map map = new HashMap(); String str = "KEY1=Value1, KE_Y2=[V@LUE2A, Value2B]], Key3=, KEY4=V-AL.UE4, KEY5={Value5}"; final String openBrackets = "({[<"; final String closeBrackets = ")}]>"; String buffer = ""; int state = 0; int i = 0; Stack stack = new Stack(); //For the brackets String key = ""; while( i < str.length() ) { char c = str.charAt(i); //Skip any whitespace if( " \t\n\r".indexOf(c) > -1 ) { ++i; continue; } switch(state) { //Reading Key case 0: if( c != '=' ) { buffer += c; } else { //Go read a value. key = buffer; state = 1; buffer = ""; } ++i; break; //Reading value case 1: //Opening bracket int pos = openBrackets.indexOf(c); if( pos != -1 ) { stack.push(pos); ++i; break; } //Closing bracket pos = closeBrackets.indexOf(c); if( pos != -1 ) { if( stack.size() == 0 ) { throw new RuntimeException("Syntax error: Unmatched closing bracket '" + c + "'" ); } int pos2 = stack.pop(); if( pos != pos2 ) { throw new RuntimeException("Syntax error: Unmatched closing bracket, expected a '" + closeBrackets.charAt(pos2) + "' got '" + c ); } ++i; break; } //Handling separators if( c == ',' ) { if( stack.size() == 0 ) { //Put the pair in the map. map.put(key, buffer); //Go read a new Key. state = 0; buffer = ""; ++i; break; } } //else buffer += c; ++i; } //switch } //while 
  1. 用String.split(“,”)拆分给定的字符串;
  2. 现在用String.split(“=”)分割数组的每个元素;