如何在键值对上使用正则表达式,其中键具有空格

时间:2018-01-30 09:36:40

标签: regex hashmap key-value

我在代码中有以下文字:

String input = "[xx] Guidance) Boundary: 123 | Total: 1010 | Steps Count test: 21 | initial value Count: 19";

我正在尝试将从Boundary开始的键值对写入LinkedHashmap,我使用了这个Pattern匹配器:

Matcher m = 
Pattern.compile("(\\S+):\\s(\\S*)(?:\\b(?!:)|$)").matcher(line1);

但是它没有工作并且忽略了键之间的空间,例如:步数计数测试?我怎样才能调整它以使其正常工作?

1 个答案:

答案 0 :(得分:0)

您可以通过将|(可选地用空格括起来)拆分来轻松获取键值对,迭代数组并使用:(也可选择用空格括起来)进行拆分。

查看示例Java代码:

Map<String, String> map = new HashMap<String, String>();
String test = "[xx] Guidance) Boundary: 123 | Total: 1010 | Steps Count test: 21 | initial value Count: 19";

String[] kvps = test.split("\\s*\\|\\s*"); // split on 'spaces|spaces'

for (int i = 0; i < kvps.length; i ++) {
    String[] kvp = kvps[i].split("\\s*:\\s*");
    map.put(kvp[0], kvp[1]);
}
// DEMO OUTPUT
for (String s : map.keySet()) {
    System.out.println(s + " => " + map.get(s));
}

结果:

initial value Count => 19
[xx] Guidance) Boundary => 123
Total => 1010
Steps Count test => 21

匹配正则表达式解决方案可能过于繁琐且不安全。例如。你可以尝试

([^:]+?)\s*:\s*([^\s|]+)

请参阅regex demo。它尽可能通用,但依赖于一些假设:在:分隔符之前不能有:且密钥不能为空,并且该值不能包含空格和| char 。如果密钥可以为空,请将([^:]+?)替换为([^:|]*?)。如果值可以包含空格,请将([^\s|]+)替换为([^|]+)。请注意,匹配后您需要trim()值。请参阅another regex demo