当前位置: 首页 > 面试题库 >

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

濮阳奇逸
2023-03-14
问题内容

我正在使用一种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,two, 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;
}

先感谢您


问题答案:

您可以使用

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


 类似资料:
  • 问题内容: 我下面有String,其格式需要将其加载到地图中,因此我需要在逗号上分割,然后加载为键及其值。 我在这里使用Splitter为我完成这项工作,但在某些情况下失败了。对于我的某些字符串,value具有一些带等号的字符串。所以对于下面的字符串,它对我来说是失败的: 如何使它适用于上述情况?对于上述情况,将为,值应为。这可能吗? 问题答案: 您可以添加一个数字来表示要拆分多少个,只需添加2个

  • 问题内容: 我有这样的URI: 我需要一个具有解析元素的集合: 确切地说,我需要C#/。NET HttpUtility.ParseQueryString方法的Java等效项。 请给我一个建议。 问题答案: 如果你正在寻找一种无需使用外部库即可实现的方法,则以下代码将为你提供帮助。 你可以使用来访问返回的,并在问题中提供URL,这将返回“ SS”。 添加了更新 URL解码 更新由于此答案仍然很受欢迎

  • 问题内容: 我有一个将存储Number对象的列表。该列表将通过分析字符串列表来填充,其中每个字符串都可以表示Number的任何子类。 如何将字符串解析为通用数字,而不是特定的整数或浮点数? 问题答案: 数字不能实例化,因为它是抽象类。我建议传入数字,但是如果您设置为字符串,则可以使用任何子类来解析它们, 要么 @请参阅NumberFormat

  • 我有一个字符串和字符串的映射,其中有键/值对,如下所示。对于每个,我将有两个键,其值如下所示。 这只是一个例子,我将有更多相同格式的键/值对。唯一的区别是将是其他一些客户机,如,之后,管道中的编号也可能不同。这就是全部。 管道分隔格式中的每个值是什么意思:这里7是计数,0.1是平均值,0.2是中位数,0.3是第95个百分位数,0.3也是第99个百分位数。第二行也是如此。它将始终采用这种格式。 问题

  • 问题内容: 我正在从数据库读取属性文件。我检查了,没有方法可以从实例中解析。有什么办法吗? 问题答案: 没错,没有从a读取方法,但实际上它有从or 读取的更通用的方法。 因此,如果您有某种方式将您的信息以任何一种方式呈现出来,那么您可以致电,即有效地逐个迭代字符的源。这感觉它应该存在,并且确实存在-java.io.StringReader。 那么,将其组合起来非常简单:

  • 问题内容: 我有一个格式的字符串时间。我没有找到任何格式来解析此字符串值。有什么办法可以将此字符串值转换为 Gotime.Time吗? 编辑-这不是重复的问题。我知道如何解析,但是我没有意识到我们可以使用除时间格式包中所列之外的任何布局。这个答案消除了我的疑惑。 问题答案: 这是完全,所以使用格式字符串(布局)。 例: 输出(在Go Playground上尝试): 引自以下文档的文档: 解析解析一