次のような文字列があります。
KEY1=Value1, KE_Y2=[V@LUE2A, Value2B], Key3=, KEY4=V-AL.UE4, KEY5={Value5}
キーと値のペアを持つマップを取得するには、分割する必要があります。の値は[]
単一の値として渡す必要があります (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<String, String> map = new HashMap<String, String>();
for (String pair : input.split(", *(?![^\\[\\]]*\\])")) {
String[] parts = pair.split("=");
map.put(parts[0], parts[1]);
}
出来上がり!
正規表現は、「コンマの後に任意の数のスペースが続く (したがって、キー名には先頭の空白がありません)。ただし、次に遭遇する括弧が閉じ括弧でない場合のみ」と述べています。
これはどう:
Map<String, String> map = new HashMap<String, String>();
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));
}