2014-03-07 35 views
0

我有这样解析查询类似SQL的匹配打开和关闭括号

((one = WORD) AND (two != 2) AND (three > 3) AND (four >= 4) AND (five < 5) AND (six <= 6) AND (seven IN (seven1, seven2)) AND (eight LIKE 'like')) 

我需要为所有组匹配模式(Java)的字符串,即注重内部组为IN运营商。我需要这样的

one = WORD 
two != 2 
three > 3 
four >= 4 
five < 5 
six <= 6 
seven IN (seven1, seven2) 
eight LIKE 'like' 

一个模式从(匹配到下一个第一)一个结果不是很好,因为IN操作符有一个内部小组

谢谢

+0

我不靠近我的编译器,所以我不能对此进行测试,但你尝试过使用带有“”AND“参数的字符串split()'方法?这应该返回给你一个字符串数组,如果你想要的话,那么对于每个字符串,你可以修剪它,并删除前导字符和尾随字符(应该是括号) – Kon

+0

如果一个值包含单词“AND”,那么怎么办?像'(一个= LAND)' –

+0

这可能会感兴趣...... https://stackoverflow.com/questions/17759004/how-to-match-string-within-parentheses-nested-in-java – Maxx

回答

0

使用从this page图案,我写此示例代码

String string = "((one = WORD) AND (two != 2) AND (three > 3) AND (four >= 4) AND (five < 5) AND (six <= 6) AND (seven IN (seven1, seven2)) AND (eight LIKE '1,2,3'))"; 

long start_time = System.currentTimeMillis(); 

Pattern pattern = Pattern.compile("\\(([^()]*|\\([^()]*\\))*\\)"); 
Matcher matcher = pattern.matcher(string); 

while (matcher.find()) 
    System.out.println(matcher.group()); 

long stop_time = System.currentTimeMillis(); 
System.out.println("Time " + (stop_time - start_time) + "ms"); 

输出是完美的,但是每formance是尴尬,7-8秒

(one = WORD) 
(two != 2) 
(three > 3) 
(four >= 4) 
(five < 5) 
(six <= 6) 
(seven IN (seven1, seven2)) 
(eight LIKE '1,2,3') 

Time 8017ms 

编辑:现在解决了这样的

string = string.substring(2, string.length() - 2); 
String[] split = string.split("\\) AND \\("); 

for (String s : split) 
    System.out.println(s); 
+1

可能你可以使用不同的方法:http://www.strchr.com/expression_evaluator – Maxx

+0

现在解决了简单的拆分,谢谢 –