2013-04-30 53 views
-3

如何分割以下字符串需要正則表達式分割字符串

String str = "(obj.userAge EQUALS 51) AND (obj.userAddress CONTAINS STREET1)"; 

,這樣我應該得到

string 1 = "obj.userAge EQUALS 512"; 
string 2 = "obj.userAddress CONTAINS STREET1"; 

str.split("AND") 

嘗試,但我需要串無托架

有時我可以從數據庫中獲取一個字符串像

String str = "(obj.userAge EQUALS 51) AND (obj.userAddress CONTAINS STREET1) OR (obj2.salary >= 3000)"; 

所以現在OR加入。

+0

你正在做的是思想以此爲'分裂)的作業('這個錯誤。如果您將其作爲find()操作來處理,那麼會更容易一些,如一些答案所示。 (我更喜歡[Achintya Jha的解決方案](http://stackoverflow.com/a/16300512/20938)。) – 2013-04-30 13:26:50

回答

3

試試這個:

public static void main(String[] args) { 
    String str = "(obj.userAge EQUALS 51) AND (obj.userAddress CONTAINS STREET1)"; 
    Pattern pattern = Pattern.compile("\\((.+?)\\)"); 
    Matcher matcher = pattern.matcher(str); 
    while (matcher.find()) { 
     System.out.println(matcher.group(1)); 
    } 

} 

輸出:

obj.userAge EQUALS 51 
obj.userAddress CONTAINS STREET1 
+0

我不需要支架。 – AmitG 2013-04-30 13:00:56

+1

只需將'matcher.group()'改爲'matcher.group(1)' – nhahtdh 2013-04-30 13:02:52

+0

@AmitG我編輯了我的答案。 – 2013-04-30 13:09:52

2

你應該比賽它與這個表達式

(?<=\\().*?(?=\\)) 

.匹配單個字符。

*是匹配0到許多前面的字符

.*?比賽0到許多字符的量詞懶惰地

(?<=)是正回顧後其檢查當前position.So (?<=a)b之前的圖案將匹配b,前提是前面有一個

(?=)是一個肯定的向前看,其中當前position.So a(?=b)後的模式將匹配a檢查只有當它的後面b

+0

+1。或者只是這個正則表達式'\\((。*?)\\)' – Maroun 2013-04-30 12:56:44

+0

@MarounMaroun他不需要'(',')' – Anirudha 2013-04-30 12:57:16

+0

這不會返回'('和')'。 – Maroun 2013-04-30 12:58:03

0

這正則表達式將產生一組爲每個支架,您就可以檢索:\((.*)\)\sAND\s\((.*)\)

+1

這不會工作,'。*'是貪婪的。 – Quetzalcoatl 2013-04-30 12:57:46

0

然而一個多(對於它的樂趣),使用番石榴:

Iterable<String> result = Splitter.on(Pattern.compile("\\(|\\)|AND")).omitEmptyStrings().trimResults().split(input);