You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何调整正则表达式匹配含空格键的键值对存入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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 06:33:44