2010-09-10 48 views
3

我想提取所有大括号括起来,所以我有这样如何使用正则表达式来提取大括号中的单词?

foo {bar} moo {mar} 

匹配可以有任意数量的这些词串的表情,但我开始觉得我以错误的方式处理这个问题。

我尝试

而且我想提取的话牙套成团,所以我可以用每一个比赛。所以,我做了一个正则表达式:

String rx = ".*\\{({GROUP}\\w+)\\}.*"; 

注:我使用JRegex语法,所以我需要转义一些curlies。

结果

结果我得到的是一个单一的(虽然是正确的)比赛bar,而我希望两场比赛barmar。我误解了什么,如何纠正?我可能需要为.部分使用一些其他量词,但我希望你也可以帮助我。

非常感谢提前!

+0

可以大括号嵌套? – MAK 2010-09-10 21:07:53

回答

5

你的正则表达式.*\{({GROUP}\w+)\}.*不起作用,因为它所有的输入字符串匹配一个时间:

  • .*比赛foo
  • \{({GROUP}\w+)\}比赛{bar}
  • .*比赛moo {mar}

你应该使用这样的东西:

List<String> matchList = new ArrayList<String>(); 

Pattern regex = Pattern.compile("\\{([^}]*)\\}"); 
Matcher regexMatcher = regex.matcher(subjectString); 
while (regexMatcher.find()) 
{ 
    matchList.add(regexMatcher.group()); 
} 

内的大括号不会被这个表达式

+3

“(?<= \\ {)([^}] *)(?= \\})”正则表达式应该给你没有大括号的单词。 – ScArcher2 2010-09-10 13:36:49

+0

太好了,解决了! – Nubsis 2010-09-10 13:53:24

2

一个变体处理,使用不愿意修改 “*?”在正则表达式中。你可以找到一个正则表达式的搜索策略其它附加信息,(贪婪,不愿意,占有欲强)在这里:http://javascript.about.com/library/blre09.htm

List<String> matchList = new ArrayList<String>(); 

Pattern regex = Pattern.compile("\\{(.*?)\\}"); 
Matcher regexMatcher = regex.matcher(subjectString); 
while (regexMatcher.find()) { 
    matchList.add(regexMatcher.group()); 
} 

语法选择是你的。这个正则表达式与@ madgnome的有相同的比例。 Personnaly,我更喜欢使用不情愿的搜索,而不是一个字符排除...

+0

谢谢,这是很好的阅读。干杯! – Nubsis 2010-09-10 13:52:31