2017-02-22 52 views
1

我試圖使用正則表達式與右括號作爲分隔符來分割字符串,並有保持架..java編寫支架分開,並保持delmiter - 正則表達式

i/p String: (GROUP=test1)(GROUP=test2)(GROUP=test3)(GROUP=test4) 

needed o/p: 
(GROUP=test1) 
(GROUP=test2) 
(GROUP=test3) 
(GROUP=test4) 

我使用的是java的正則表達式 - 「\([^)] *?\)」,它是扔我error..Below是我使用的代碼,當我試圖讓組,其引發錯誤..

Pattern splitDelRegex = Pattern.compile("\\([^)]*?\\)"); 
    Matcher regexMatcher = splitDelRegex.matcher("(GROUP=test1)(GROUP=test2) (GROUP=test3)(GROUP=test4)"); 
    List<String> matcherList = new ArrayList<String>(); 
    while(regexMatcher.find()){ 
     String perm = regexMatcher.group(1); 
     matcherList.add(perm); 
    } 

任何幫助表示讚賞..謝謝

+0

你看到什麼錯誤? – Encaitar

+0

我得到組(1)沒有找到錯誤:( – marc

回答

2

你根本忘了捕捉周圍的整個正則表達式的括號內。你沒有捕獲任何東西,只是正則表達式改爲

Pattern splitDelRegex = Pattern.compile("(\\([^)]*?\\))"); 
             ^  ^ 

我在Eclipse中測試了這個,並得到了你想要的結果。

+0

其預計工作吉姆..感謝你的幫助.. :) – marc

-1

你可以ü SE

str.split(")") 

這將返回一個字符串,你會知道缺少右括號,因此可以在事後將其添加回陣列。這似乎更容易,更不容易出錯。

-1

你可以嘗試改變這一行:

String perm = regexMatcher.group(1); 

要這樣:

String perm = regexMatcher.group(); 

所以你讀的最後一組發現。

+0

我測試了這個,它的工作原理。不知道爲什麼我downvoted。相同的matt's答案 – jambriz

-1

我不知道爲什麼你需要拆分字符串。您可以使用正則表達式捕獲每個括號內的組。

試試這個正則表達式(\\([a-zA-Z0-9=]*\\))。我有一個捕獲組(),它查找以文字\\(開頭的文本,包含[a-zA-Z0-9=]零次或多次*並以文字\\)結尾。這是一個非常寬鬆的正則表達式,如果括號內的文本是可預測的,則可以加緊匹配。

String input = "(GROUP=test1)(GROUP=test2)(GROUP=test3)(GROUP=test4)"; 
String regex = "(\\([a-zA-Z0-9=]*\\))"; 
Pattern pattern = Pattern.compile(regex); 
Matcher matcher = pattern.matcher(input); 

while(matcher.find()) { // find the next match 
    System.out.println(matcher.group()); // print the match 
} 

輸出:

(GROUP=test1) 
(GROUP=test2) 
(GROUP=test3) 
(GROUP=test4) 
-1

使用背後斷言看看分裂它。 "(?<=\\))"
斷言存在字符,實際上不是字符。

結果是它之間的分裂)(和你的所有文字。

要小心的是,它的每一個)發現,這可能不會給你
你的期望後會分裂。