将key = value的字符串解析为Map

问题描述

您可以使用

(\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;
}

Java测试

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

先感谢您

相关问答

如何检查配对的蓝牙设备是打印机还是扫描仪(Android)
是否允许实体正文进行HTTP DELETE请求?
如何将ZipInputStream转换为InputStream?
java.util.logging Java 8中的变量
PowerMockito.doReturn返回null
JavaMail问题:无法将命令发送到SMTP主机