正则拆分含数字与DR/CR标识的字符串不符合预期的问题
正则拆分含数字与DR/CR标识的字符串不符合预期的问题
我完全明白你遇到的问题了——你希望把标题部分和每个带DR/CR的数值段单独拆分开,但当前的正则只在部分位置拆分,导致第一个数值段和标题粘在了一起。咱们来一步步解决这个问题:
问题根源分析
你用的原正则(?<=\d{1,}\.\d{2} (DR|CR))是一个正向后瞻,它的逻辑是:只在“匹配到数字.两位小数 + 空格 + DR/CR的位置之后”进行拆分。但原字符串里,标题和第一个数值段之间的位置(比如(FEES) 后面)并不满足这个后瞻条件,所以这个位置不会被拆分,导致第一个元素包含了标题和第一个11.97 DR。
解决方案
我们需要新增一个拆分条件,把标题和第一个数值段也拆分开。具体来说,要同时匹配两个拆分位置:
- 标题和第一个数值段之间的空格处(也就是即将出现
数字.两位小数 + 空格 + DR/CR的位置) - 每个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
相关产品推荐
相关产品推荐

