Java中如何拆分含圆括号的字符串,使括号单独成为数组元素
解决表达式字符串拆分问题:让括号单独成为数组元素
你的问题核心是原正则只处理了数字与非数字的边界,但没有考虑到括号和其他非数字符号(比如*、-)之间的拆分,导致括号和相邻符号被合并到同一个数组元素里。
解决方案:修改拆分正则表达式
把原方法的split正则替换为包含括号边界匹配的版本,代码如下:
import java.util.Arrays; public void convertString(String s) { // 修改后的正则表达式,新增括号的前后拆分规则 String[] arr = s.split("(?<=[\\d.])(?=[^\\d.])|(?<=[^\\d.])(?=[\\d.])|(?<=[()])|(?=[()])"); // 打印验证结果 System.out.println(Arrays.toString(arr)); }
正则表达式详解
这个正则由4部分逻辑组成,用|分隔,覆盖所有需要拆分的边界:
(?<=[\\d.])(?=[^\\d.]):在数字/小数点和非数字/非小数点之间拆分(保留原逻辑,处理数字和符号的分界);(?<=[^\\d.])(?=[\\d.]):在非数字/非小数点和数字/小数点之间拆分(保留原逻辑,处理符号和数字的分界);(?<=[()]):在任意括号的后面拆分(比如两个连续括号)),会拆成单独的)和));(?=[()]):在任意括号的前面拆分(比如*(会拆成*和(,-)会拆成-和));
测试验证
用你的测试字符串"1+2*(30+4/2-(1+2))*2+1"运行修改后的代码,输出结果为:
[1, +, 2, *, (, 30, +, 4, /, 2, -, (, 1, +, 2, ), ), *, 2, +, 1]
完全符合你期望的拆分效果。
额外边缘情况验证
比如处理连续括号的场景"((123-45))",拆分结果为[(, (, 123, -, 45, ), )],括号都单独成元素,符合需求。
内容的提问来源于stack exchange,提问作者Dartweiler
相关产品推荐
相关产品推荐

