4

次のような文字列があります。

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

キーと値のペアを持つマップを取得するには、分割する必要があります。の値は[]単一の値として渡す必要があります (KE_Y2はキーであり[V@LUE2A, Value2B]、 は値です)。

正しく分割するには、どの正規表現を使用すればよいですか?

4

4 に答える 4

9

最初の分割には魔法の正規表現があります。

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]);
}

出来上がり!


魔法の正規表現の説明:

正規表現は、「コンマの後に任意の数のスペースが続く (したがって、キー名には先頭の空白がありません)。ただし、次に遭遇する括弧が閉じ括弧でない場合のみ」と述べています。

于 2013-04-19T08:10:28.983 に答える
4

これはどう:

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));
} 
于 2013-04-19T08:10:50.993 に答える