如何使用正则表达式在大括号中提取单词?

时间:2010-09-10 13:23:16

标签: java regex

我想提取用大括号括起来的所有单词,所以我有一个像这样的表达式

foo {bar} moo {mar}

要匹配的字符串可能包含任意数量的这些单词,但我开始认为我正以错误的方式处理此问题。

我的尝试

我试图将大括号分成几组,这样我就可以使用每一个匹配。所以,我做了一个正则表达式:

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

注意:我正在使用JRegex语法,所以我需要逃避一些问题。

结果

我得到的结果是单个(尽管是正确的)匹配bar,而我期望两个匹配barmar。我误解了什么,我该如何纠正呢?我可能需要为.部分使用其他量词,但我希望你也可以帮助我。

非常感谢提前!

2 个答案:

答案 0 :(得分: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());
} 

此正则表达式

不处理内部花括号

答案 1 :(得分: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,我更喜欢使用不情愿的搜索而不是字符排除...