我在代码中有以下文字:
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);
但是它没有工作并且忽略了键之间的空间,例如:步数计数测试?我怎样才能调整它以使其正常工作?
答案 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。