我在想String.split()
。我们首先要以逗号分隔大括号内的消息部分,然后以等号分隔。但是,显然不是每个逗号。仅在新键字母和等号之前的逗号处。在代码中:
String message
= "Value{A=10,B=20,C=30,"D=700-2-1, Bourke STREET, SOUTH 2/28 QUEEN ST,E=40,F=50}";
String contents = message.replaceFirst("^Value\\{(.*)\\}$", "$1");
String[] pairs = contents.split(",(?=[ABCDEF]=)");
Map<String, String> m = Arrays.stream(pairs)
.map(p -> p.split("=", 2))
.collect(Collectors.toMap(a -> a[0], a -> a[1]));
m.forEach((k, v) -> System.out.println(k + " -> " + v));
输出是:
A -> 10
B -> 20
C -> 30
D -> 700-2-1, Bourke STREET, SOUTH 2/28 QUEEN ST
E -> 40
F -> 50
(?=[ABCDEF]=)
在第二个正则表达式中是积极的前瞻。它确保我们只匹配逗号,如果它后面跟着这些字母之一和 en 等号。如果字母可以不是 ABCDEF,您可能希望使用\w
单词字符而不是[ABCDEF]
.
我们不一定需要流操作,但您已经标记了您的问题 java-stream,所以我想您希望看到一个。
流操作不能保证给你一个HashMap
. 即使您观察到它确实如此(在我的例子中是在 Java 11 上实现的),它可能不会出现在下一个 Java 版本上,甚至可能不会出现在不同的输入中。对于大多数情况,这应该是无关紧要的。如果您有特定原因需要确定,请检查您得到的内容,如果不是,请转换HashMap
:
if (! m.getClass().equals(HashMap.class)) {
m = new HashMap<>(m);
}