我收到字符串
String message = "Value{A=10,B=20,C=30,D=700-2-1, Bourke STREET, SOUTH 2/28 QUEEN ST,E=40,F=50}";
Map<Object, Object> = {
A = 10 ,
B = 20
C = 30
D = 700-2-1, Bourke STREET, SOUTH 100/28 QUEEN ST
E = 40
F = 50
}
我正在寻找一种通用的方法。何处
需要A、B、C…的所有值。。。。
A、B、C、D、E和F的顺序将改变
只有D的值中可以包含单个或多个逗号(,(,也可以不包含逗号
我在想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]=)
是正前瞻。它确保我们只有在逗号后面跟一个字母并且是等号的情况下才匹配逗号。如果字母可以不是ABCDEF,则您可能希望使用w
而不是[ABCDEF]
作为单词字符。
我们不一定需要流操作,但您已经标记了您的问题java流,所以我认为您希望看到一个。
流操作不能保证为您提供HashMap
。即使您观察到它确实如此(在我的案例中,它在Java11上就是这样(,它也可能不会出现在下一个Java版本上,甚至不会有不同的输入。对于大多数情况来说,这不应该引起关注。如果你有特定的原因需要确定,请检查你得到的东西,如果不是HashMap
:,请进行转换
if (! m.getClass().equals(HashMap.class)) {
m = new HashMap<>(m);
}
此代码适用于上述场景:
public static void main(String... args) {
String message = "Value{A=10,B=20,C=30,D=700-2-1, Bourke STREET, SOUTH 2/28 QUEEN ST,E=40,F=50}";
//remove value and curly braces
message = message.substring(6,message.length()-1);
//split by comma followed by capital letter
String[] values= message.split("(?<=,)(?=[A-Z])");
//split and collect to map
Map<String, String> map = Arrays.asList(values).stream()
.map(x-> x.lastIndexOf(",")>-1?x.substring(0, x.lastIndexOf(",")):x)
.map(x-> x.split("="))
.collect(Collectors.toMap(x -> x[0], x-> x[1]));
//print map
System.out.println(map);
}