问题描述
您可以使用
(\w+)=(.*?)(?=,\w+=|$)
请参阅regex演示。
-
(\w+)
-第1组:一个或多个单词字符 -
=
-等号 -
(.*?)
-第2组:除换行符以外的任何零个或多个字符,请尽可能少 -
(?=,\w+=|$)
-正向超前查询,需要一个,
,然后是1+个单词字符,然后是=
,或者紧接当前位置右侧的字符串结尾。
Java代码:
public static Map<String, String> getAttributes(String attributes) {
Map<String, String> attr = new HashMap<>();
Matcher m = Pattern.compile("(\\w+)=(.*?)(?=,\\w+=|$)").matcher(attributes);
while (m.find()) {
attr.put(m.group(1), m.group(2));
}
return attr;
}
String s = "Overtime=true,TransportCosts=1= 1,two, three,Billable=7200";
Map<String,String> map = getAttributes(s);
for (Map.Entry entry : map.entrySet()) {
System.out.println(entry.getKey() + "=" + entry.getValue());
}
结果:
Overtime=true
Billable=7200
TransportCosts=1= 1,two, three
解决方法
我正在使用一种API,该API为我提供了XML,并且我需要从一个实际上是字符串的标签中获取一张地图。例:
有
Billable=7200,Overtime=false,TransportCosts=20$
我需要
["Billable"="7200","Overtime=false","TransportCosts"="20$"]
问题在于字符串是完全动态的,因此它可以像
Overtime=true,TransportCosts=one,two,three
Overtime=true,TransportCosts=1= 1,three,Billable=7200
所以我不能只用逗号然后用等号分开。是否可以使用正则表达式将类似字符串的内容转换为地图?
到目前为止,我的代码是:
private Map<String,String> getAttributes(String attributes) {
final Map<String,String> attr = new HashMap<>();
if (attributes.contains(",")) {
final String[] pairs = attributes.split(",");
for (String s : pairs) {
if (s.contains("=")) {
final String pair = s;
final String[] keyValue = pair.split("=");
attr.put(keyValue[0],keyValue[1]);
}
}
return attr;
}
return attr;
}
先感谢您