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

使用正则表达式从字符串提取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

存在两个核心问题:

  1. 强制匹配2组「日期+数值」,无法适配只有1组的行
  2. 生成了5个独立分组,无法按「章节编号 + 多组日期数值」的逻辑提取数据

正确的正则方案

方案1:先抓整体再拆分(灵活适配任意数量的数值组)

开启多行模式(m),使用以下正则:

#Section(\d+)(?:.*?/Jack/M,)\s*((?:\d+\s+[-+]?\d+(?:\.\d+)?\s*)+)

用法说明:

  1. 第一个分组(\d+)直接捕获章节编号
  2. 第二个分组捕获所有「日期+数值」的组合字符串,之后再用子正则(\d+)\s+([-+]?\d+(?:\.\d+)?)拆分这个字符串,就能得到每一组的日期和数值

方案2:直接捕获每组日期和数值(适合固定1-2组的场景)

同样开启多行模式,使用这个正则:

#Section(\d+)(?:.*?/Jack/M,)(?:\s*(\d+)\s+([-+]?\d+(?:\.\d+)?))(?:\s*(\d+)\s+([-+]?\d+(?:\.\d+)?))?

用法说明:

  1. 第一个分组(\d+)捕获章节编号
  2. (\d+)和([-+]?\d+(?:\.\d+)?)是第一组日期和数值的捕获组
  3. 末尾的?表示第二组日期和数值是可选的,完美适配只有1组的行

匹配结果示例

针对给定的字符串:

  • 第一行(含2组数值):
    • 章节编号:250342
    • 第一组:日期200010,数值10.00
    • 第二组:日期200011,数值-2.00
  • 第四行(含1组数值):
    • 章节编号:251234
    • 第一组:日期200011,数值11.00

内容的提问来源于stack exchange,提问作者Ajm Kir

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 23:15:33