如何避免拆分括号内的逗号?多分隔符字符串拆分正则修复求助
问题解决:多分隔符拆分字符串并忽略括号内的逗号
嘿,我懂你现在的困扰——之前的正则只会无脑匹配所有指定的分隔符,完全没考虑它们是不是在括号里,所以才会把(Rajesh,Suresh)里的逗号也拆了。别急,我们只需要给正则加个“智能判断”,让它只拆分不在括号内部的分隔符就行。
核心思路:用正则断言排除括号内内容
我们可以利用正则的负向零宽断言来实现这个逻辑:简单说就是,让正则只匹配那些“前面没有未闭合左括号,后面没有未闭合右括号”的分隔符。
最终可用的正则表达式
直接上能用的正则,我再给你拆解清楚:
(?<!\([^)]*)(,|;| OR | AND )(?![^(]*\))
逐个部分解释:
(?<!\([^)]*):负向后行断言,确保当前要匹配的分隔符,前面没有“左括号+一串非右括号字符”的组合——也就是说,这个分隔符不在左括号开启的未闭合区间里。(,|;| OR | AND ):匹配我们需要的分隔符,这里注意OR/AND前后加了空格,是因为你的示例输入里它们前后有空格;如果你的场景需要匹配不带空格的OR/AND,或者大小写不敏感,改成(,|;|\b(OR|AND)\b)或者(,|;|\b(or|and|OR|AND)\b)就行。(?![^(]*\)):负向前瞻断言,确保当前分隔符后面没有“一串非左括号字符+右括号”的组合——也就是说,这个分隔符不在右括号闭合之前的区间里。
修改后的完整代码
把你的代码换成下面这样,就能得到正确结果了:
import java.util.ArrayList; import java.util.List; import java.util.regex.Pattern; public class QuerySplitter { public static void main(String[] args) { String query = "device_name==device503,device_type!=GATEWAY;site_name<site3434 OR country==India AND location==BLR; new_name=in=(Rajesh,Suresh)"; // 编译正则,注意Java里转义字符\要写成\\ Pattern ptn = Pattern.compile("(?<!\\([^)]*)(,|;| OR | AND )(?![^(]*\\))"); String[] parts = ptn.split(query); List<String> queryParams = new ArrayList<>(); for(String p : parts){ String trimmedPart = p.trim(); // 过滤拆分后可能出现的空字符串 if(!trimmedPart.isEmpty()){ queryParams.add(trimmedPart); System.out.println(trimmedPart); } } } }
测试输出结果
运行这段代码,输入的字符串会被正确拆分成以下几个部分:
device_name==device503device_type!=GATEWAYsite_name<site3434country==Indialocation==BLRnew_name=in=(Rajesh,Suresh)
看到没?括号里的Rajesh,Suresh完全保留,没有被拆分,完美符合你的需求!
额外说明
如果你的场景里存在嵌套括号(比如(a,(b,c))),上面的正则可能会失效,因为它只处理了单层括号的情况。如果需要支持嵌套,那最好手动写个解析逻辑:用一个计数器追踪括号的开闭状态,遇到左括号计数器+1,右括号-1,只有当计数器为0的时候,才把遇到的分隔符当作拆分点。不过从你的示例来看,单层括号应该足够用啦。
内容的提问来源于stack exchange,提问作者Rajesh Jaiswal
相关产品推荐
相关产品推荐

