2017-02-22 27 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

使用背后断言看看分裂它。 "(?<=\\))"
断言存在字符,实际上不是字符。

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

要小心的是,它的每一个)发现,这可能不会给你
你的期望后会分裂。