Java中如何仅按单个竖线分割字符串、保留连续竖线不拆分
Java 单字符拆分且不拆分连续同分隔符的实现方案
原有代码不符合预期的核心原因
String.split()的入参本质是正则表达式,不是普通字面量字符串。|是正则中的特殊元字符,代表“逻辑或”匹配规则,直接传入"|"实际等价于匹配任意两个字符间的位置,根本达不到按竖线拆分的效果。- 即便对竖线做正确转义,默认拆分逻辑会把连续出现的分隔符识别为多个独立拆分边界,拆出空字符串,也不符合“连续同分隔符不触发拆分”的需求。
实现匹配预期的拆分规则
要达成拆分"data1|data2||data3"得到["data1", "data2||data3"]的效果,需要通过正则规则做两个约束:
- 转义正则特殊字符,让匹配目标变为字面量的
|字符 - 增加前后置断言,只有前后都不相邻同分隔符的单个分隔符,才会被认定为拆分边界,连续出现的分隔符不触发拆分
可直接复用的实现代码
String data = "data1|data2||data3"; // 正则规则拆解: // \\| 转义后匹配字面量竖线 // (?<!\\|) 负向后行断言:当前匹配的竖线前面没有相邻的其他竖线 // (?!\\|) 负向前行断言:当前匹配的竖线后面没有相邻的其他竖线 // 整体逻辑:只有完全独立的单个|才会作为拆分切分点 String[] arrayData = data.split("(?<!\\|)\\|(?!\\|)");
拆分结果完全匹配预期:
arrayData[0] = "data1"arrayData[1] = "data2||data3"
通用提示:如果分隔符是其他普通字符(比如逗号、短横线),可以直接套用上述断言规则,只需要把正则里的竖线替换成对应分隔符即可。例如要按逗号拆分、连续逗号不触发拆分,可使用正则
"(?<!,),(?!,)"。
内容的提问来源于stack exchange,提问作者rajeev tejapuriya
相关产品推荐
相关产品推荐

