我有一个字符串,我想在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());
}
答案 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"
),则不需要将其放在括号内。