将key = value的String解析为Map [英] Parse a String of key=value to a Map

查看:737
本文介绍了将key = value的String解析为Map的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用一个API,它为我提供了一个XML,我需要从一个标签获取一个实际上是字符串的地图。示例:

I'm using an API that gives me a XML and I need to get a map from one tag which is actually a string. Example:

Billable=7200,Overtime=false,TransportCosts=20$

我需要

["Billable"="7200","Overtime=false","TransportCosts"="20$"]

问题是字符串是完全动态的,所以,它可以像

The problem is that the string is totally dynamic, so, it can be like

Overtime=true,TransportCosts=one, two, three
Overtime=true,TransportCosts=1= 1,two, three,Billable=7200

所以我不能用逗号分割,然后用等号分开。
是否可以使用正则表达式将类似字符串转换为地图?

So I can not just split by comma and then by equal sign. Is it possible to convert a string like those to a map using a regex?

到目前为止我的代码是:

My code so far is:

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

提前谢谢

推荐答案

您可以使用

(\w+)=(.*?)(?=,\w+=|$)

参见正则表达式演示

详细信息


  • (\ w +) - 第1组:一个或多个单词字符

  • = - 等号

  • (。*?) - 第2组:除了换行符之外的任何零个或多个字符,尽可能少

  • (?=,\ w + = | $) - 一个积极的前瞻,需要一个,然后是1个字的字符,然后是 = ,或紧接在当前位置右侧的字符串结尾。

  • (\w+) - Group 1: one or more word chars
  • = - an equal sign
  • (.*?) - Group 2: any zero or more chars other than line break chars, as few as possible
  • (?=,\w+=|$) - a positive lookahead that requires a ,, then 1+ word chars, and then =, or end of string immediately to the right of the current location.

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

这篇关于将key = value的String解析为Map的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆