2014-03-07 31 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

現在解決了簡單的拆分,謝謝 –