使用正则表达式从字符串提取3组关联数据的问题求助
正则提取指定内容的解决方案
问题背景
给定目标字符串:
String s = #Section250342,Main,First/HS/12345/Jack/M,200010 10.00 200011 -2.00, #Section250322,Main,First/HS/12345/Aaron/N,200010 17.00, #Section250399,Main,First/HS/12345/Jimmy/N,200010 12.00, #Section251234,Main,First/HS/12345/Jack/M,200011 11.00需要提取所有包含
/Jack/M的行中的三类信息:
- 章节编号(如
250342、251234)- 日期(如
200010、200011)- 关联数值(如
10.00、-2.00、11.00)
注意:每行可能包含1组或2组「日期+数值」的组合。
原正则的问题
之前尝试的正则:
#Section(\d+)(?:(?!#Section\d).)*\bJack/M,(\d+)\h+(\d+(?:\.\d+)?)\s(\d+)\h+([-+]?\d+(?:\.\d+)?)\b
存在两个核心问题:
- 强制匹配2组「日期+数值」,无法适配只有1组的行
- 生成了5个独立分组,无法按「章节编号 + 多组日期数值」的逻辑提取数据
正确的正则方案
方案1:先抓整体再拆分(灵活适配任意数量的数值组)
开启多行模式(m),使用以下正则:
#Section(\d+)(?:.*?/Jack/M,)\s*((?:\d+\s+[-+]?\d+(?:\.\d+)?\s*)+)
用法说明:
- 第一个分组
(\d+)直接捕获章节编号 - 第二个分组捕获所有「日期+数值」的组合字符串,之后再用子正则
(\d+)\s+([-+]?\d+(?:\.\d+)?)拆分这个字符串,就能得到每一组的日期和数值
方案2:直接捕获每组日期和数值(适合固定1-2组的场景)
同样开启多行模式,使用这个正则:
#Section(\d+)(?:.*?/Jack/M,)(?:\s*(\d+)\s+([-+]?\d+(?:\.\d+)?))(?:\s*(\d+)\s+([-+]?\d+(?:\.\d+)?))?
用法说明:
- 第一个分组
(\d+)捕获章节编号 (\d+)和([-+]?\d+(?:\.\d+)?)是第一组日期和数值的捕获组- 末尾的
?表示第二组日期和数值是可选的,完美适配只有1组的行
匹配结果示例
针对给定的字符串:
- 第一行(含2组数值):
- 章节编号:
250342 - 第一组:日期
200010,数值10.00 - 第二组:日期
200011,数值-2.00
- 章节编号:
- 第四行(含1组数值):
- 章节编号:
251234 - 第一组:日期
200011,数值11.00
- 章节编号:
内容的提问来源于stack exchange,提问作者Ajm Kir
相关产品推荐
相关产品推荐

