【问题标题】:How to use regex on key value pair, where the key has white space如何在键值对上使用正则表达式,其中键有空格
【发布时间】:2018-01-30 18:06:22
【问题描述】:

我在代码中有以下文字:

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

我正在尝试将以 Boundary 开头的键值对写入 LinkedHashmap,我使用了此模式匹配器:

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

但它不起作用并忽略键之间的空格,例如:步数测试?我该如何调整它以使其正常工作?

【问题讨论】:

  • 我不清楚你在问什么。你想要什么结果?您需要考虑哪些输入格式?您使用什么语言?您是否可以考虑使用一些简单的逻辑,例如:“将所有内容从 'Boundary' 开始直到字符串的结尾,然后在 '|' 上拆分字符”?
  • 我正在使用 Java,我当前使用的正则表达式不适用于我提供的输入格式。 “边界:123 | 总计:1010 | 步数测试:21 | 初始值计数:19”的正确正则表达式是什么。这样我就可以将键值对映射到这样的映射 while (m.find()) { pairs.put(m.group(1), m.group(2)); }
  • 正确答案是,就像我说的,可能是not to use a regex。有更简单的方法可以做到这一点。
  • 我下面的解决方案对您有用吗?

标签: regex hashmap key-value


【解决方案1】:

您可以通过使用|(可选用空格括起来)分割它们,迭代数组并使用:(也可选用空格括起来)分割它们来轻松获取键值对。

查看示例 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。它尽可能通用,但依赖于一些假设:: 分隔符之前不能有:,并且键不能为空,值不能有空格和| 字符。如果密钥可以为空,请将([^:]+?) 替换为([^:|]*?)。如果值可以包含空格,请将([^\s|]+) 替换为([^|]+)。请注意,在匹配它们之后,您需要 trim() 值。见another regex demo。

【讨论】:

    猜你喜欢
    • 2015-03-23
    • 1970-01-01
    • 2017-03-04
    • 2017-02-16
    • 2011-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多