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

正则拆分含数字与DR/CR标识的字符串不符合预期的问题

正则拆分含数字与DR/CR标识的字符串不符合预期的问题

我完全明白你遇到的问题了——你希望把标题部分和每个带DR/CR的数值段单独拆分开,但当前的正则只在部分位置拆分,导致第一个数值段和标题粘在了一起。咱们来一步步解决这个问题:

问题根源分析

你用的原正则(?<=\d{1,}\.\d{2} (DR|CR))是一个正向后瞻,它的逻辑是:只在“匹配到数字.两位小数 + 空格 + DR/CR的位置之后”进行拆分。但原字符串里,标题和第一个数值段之间的位置(比如(FEES) 后面)并不满足这个后瞻条件,所以这个位置不会被拆分,导致第一个元素包含了标题和第一个11.97 DR。

解决方案

我们需要新增一个拆分条件,把标题和第一个数值段也拆分开。具体来说,要同时匹配两个拆分位置:

  1. 标题和第一个数值段之间的空格处(也就是即将出现数字.两位小数 + 空格 + DR/CR的位置)
  2. 每个DR/CR的后面(和你原正则的逻辑一致)

调整后的正则如下(注意Java的转义规则):

"(?=\\d+\\.\\d{2} (DR|CR))|(?<=(DR|CR))"

正则逻辑拆解

  • (?=\\d+\\.\\d{2} (DR|CR)):正向预查,专门匹配标题和第一个数值段之间的位置——它会找到“后面紧跟数字.两位小数 + 空格 + DR/CR”的位置,把标题单独拆出来。
  • (?<=(DR|CR)):正向后瞻,和你原正则的核心逻辑一致,匹配DR/CR后面的位置,把每个数值段拆分开。

修改后的代码

String text = "TAXABLE VALUE OF SUPPLY (FEES) 11.97 DR11.97 DR0.00 CR";
String[] parts = text.split("(?=\\d+\\.\\d{2} (DR|CR))|(?<=(DR|CR))");

// 遍历输出拆分结果
for (String part : parts) {
    System.out.println(part);
}

输出结果

TAXABLE VALUE OF SUPPLY (FEES)
11.97 DR
11.97 DR
0.00 CR

这个正则也能完美适配你提供的其他测试用例(比如text1、text2、text3),因为它们的结构都是“标题 + 数值DR + 数值DR + 数值CR”,完全符合正则的匹配逻辑。

额外注意点

  • Java字符串里的正则需要转义特殊字符:\d要写成\\d,.要写成\\.,否则会编译报错。
  • 如果后续遇到整数形式的数值(比如520 DR而不是520.00 DR),可以把正则里的\\.\\d{2}改成(\\.\\d{2})?,兼容整数和两位小数的情况。

备注:内容来源于stack exchange,提问作者iCoder

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.15 09:45:29