Java中如何使用正则正确分割{1-10}类范围表达式
Java正则拆分含大括号表达式的正确实现
现有问题
- 目标需求:在Java中通过正则拆分
{1-5}、{1-10}、{1-100}这类表达式 - 原有实现代码:
String arr[] = expr.replaceAll("\\s+", "").split("(?<=[-+*/()])|(?=[-+*/()])");
- 实际运行结果不符合预期:
{1-5}被拆分为{1、-、5三个元素{1-10}被拆分为{1、-、10三个元素{1-100}被拆分为{1、-、100三个元素
- 预期拆分规则:大括号需要作为独立元素拆分,例如
{1-5}要拆成{、1、-、5、}五个独立元素。
问题根因
原有拆分正则的匹配边界只覆盖了-+*/()运算符和小括号,没有将大括号{}纳入前后位置断言的匹配范围,导致大括号会和相邻的数字拼接在一起,无法被单独拆分。
修复方案
将大括号加入正则的前后断言匹配字符集即可,修改后的代码如下:
// 仅处理大括号、原有四则运算符和小括号的版本 String arr[] = expr.replaceAll("\\s+", "") .split("(?<=[-+*/(){}])|(?=[-+*/(){}])");
如果后续需要兼容中括号[]的拆分,可以使用扩展版本的正则:
// 兼容小括号、中括号、大括号和四则运算符的版本 String arr[] = expr.replaceAll("\\s+", "") .split("(?<=[-+*/(){}\\[\\]])|(?=[-+*/(){}\\[\\]])");
验证结果
传入{1-5}测试,拆分后数组元素依次为{、1、-、5、},完全符合预期。{1-10}、{1-100}等同类表达式均可按照相同规则正确拆分,不会再出现大括号和数字粘连的问题。
内容的提问来源于stack exchange,提问作者Pushpendra Singh
相关产品推荐
相关产品推荐

