如何调整正则表达式匹配含空格键的键值对存入LinkedHashMap
解决带空格键的键值对匹配问题
你的问题根源在于原正则里的\S+只能匹配非空白字符,所以遇到Steps Count test这种带空格的键时,只会匹配到第一个空格前的Steps,自然无法完整捕获带空格的键。
要解决这个问题,我们需要调整正则的逻辑:让键的匹配范围是从键值对的起始位置到冒号:之前的所有内容(包含空格),同时正确识别每个键值对的边界(由|分隔或字符串结尾)。
调整后的正则表达式
Pattern pattern = Pattern.compile("(?:\\bBoundary\\b|(?<=\\|))\\s*([^:]+?)\\s*:\\s*([^|]+?)(?=\\s*\\||$)");
正则逻辑拆解
(?:\\bBoundary\\b|(?<=\\|)):定位每个键值对的起始点——要么是Boundary这个单词(匹配第一个键值对的开头),要么是紧跟在|之后的位置(匹配后续的键值对)\\s*:匹配键前后可能存在的空白字符([^:]+?):非贪婪匹配键的内容,直到遇到冒号:,这样就能完整捕获带空格的键(比如Steps Count test)\\s*:\\s*:匹配冒号:以及前后的空白字符([^|]+?):非贪婪匹配值的内容,直到遇到下一个|或者字符串结尾(?=\\s*\\||$):正向前瞻,确保匹配的终止位置是|或者字符串末尾,避免值被截断
代码示例
String input = "[xx] Guidance) Boundary: 123 | Total: 1010 | Steps Count test: 21 | initial value Count: 19"; LinkedHashMap<String, String> map = new LinkedHashMap<>(); Matcher m = Pattern.compile("(?:\\bBoundary\\b|(?<=\\|))\\s*([^:]+?)\\s*:\\s*([^|]+?)(?=\\s*\\||$)").matcher(input); while (m.find()) { // 去除键和值前后的空白字符 String key = m.group(1).trim(); String value = m.group(2).trim(); map.put(key, value); } // 输出结果 map.forEach((k, v) -> System.out.println(k + " = " + v));
运行这段代码,你会得到完整的键值对:
Boundary = 123 Total = 1010 Steps Count test = 21 initial value Count = 19
额外说明
如果你的值可能包含|(虽然当前例子里没有),可以把值的匹配逻辑改成.*?(?=\s*\||$)(非贪婪匹配到下一个|或结尾),不过这样要注意性能问题;如果值都是非空白字符,也可以用\\S+,但显然你的场景里键带空格,值可能也有空格的话,还是用[^|]+?或.*?(?=\s*\||$)更稳妥。
内容的提问来源于stack exchange,提问作者user0007
相关产品推荐
相关产品推荐

