如何避免在括号中的逗号上拆分?

时间:2018-01-16 11:10:04

标签: java string split

我有一个字符串,我想在String数组中拆分多个分隔符。

分隔符是逗号(,),分号(;)," OR"和" AND"。 但如果它在括号中,我不想分开逗号。

示例输入:

device_name==device503,device_type!=GATEWAY;site_name<site3434 OR country==India AND location==BLR; new_name=in=(Rajesh,Suresh)

我可以用正则表达式拆分String,但是它没有正确处理括号中的逗号。

我该如何解决这个问题?

Pattern ptn = Pattern.compile("(,|;|OR|AND)");
String[] parts = ptn.split(query);
for(String p:parts){
   System.out.println(p);
   queryParams.add(p.trim());
}

2 个答案:

答案 0 :(得分:1)

你可以使用负面预测:。

String[] parts = input.split(",(?![^()]*\\))|;| OR | AND ")

或者你可以做的更丑陋(但也许在概念上更简单)的方法是用临时占位符替换括号内的任何逗号,然后执行拆分并用结果中的真实逗号替换占位符。

String input = "X,Y=((A,B),C) OR Z";

Pattern pattern = Pattern.compile("\\(.*\\)");
Matcher matcher = pattern.matcher(input);
StringBuffer sb = new StringBuffer();
while (matcher.find()) {
    matcher.appendReplacement(sb, matcher.group().replaceAll(",", "_COMMA_"));
}
matcher.appendTail(sb);

String[] parts = sb.toString().split("(,|;| OR | AND )");
for (String part : parts) {
    System.out.println(part.replace("_COMMA_", ","));
}

打印:

X
Y=((A,B),C)
Z

或者,您可以编写自己的小标记生成器,使用charAt(index)逐个字符地读取输入,或者为现成的解析器定义语法。

答案 1 :(得分:0)

您可以使用negative look-ahead(?!...)查看以下字符,如果这些字符与括号中的模式匹配,则整体匹配将失败。

String query = "device_name==device503,device_type!=GATEWAY;site_name<site3434 OR country==India AND location==BLR; new_name=in=(Rajesh,Suresh)";
String[] parts = query.split("\\s*(,(?![^()]*\\))|;|OR|AND)\\s*");
for(String part: parts)
   System.out.println(part);

输出:

device_name==device503
device_type!=GATEWAY
site_name<site3434
country==India
location==BLR
new_name=in=(Rajesh,Suresh)

因此,在这种情况下,我们会检查,后面的字符是0还是更多字符,而不是(),后跟)如果这是真的,则,匹配失败。

如果您可以使用嵌套括号,那么这不会起作用。

注意:

  • String也有一个split方法(如上所用),这对于简单起见很有用(但比重用Pattern要慢一些多次String s)一遍又一遍。

  • 您可以在正则表达式中添加\\s*(0个或更多空格字符),以删除分隔符之前或之后的任何空格。

  • 如果您在使用|之前或之后没有任何内容(例如"a|b|c"),则不需要将其放在括号内。

    < / LI>