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

我想提取括在花括号中的所有单词 ,所以我有一个像这样的表达式

foo {bar} moo {mar} 

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

我的尝试

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

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

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

结果

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

提前谢谢了!

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

  • .*匹配foo
  • \{({GROUP}\w+)\}匹配{bar}
  • .*匹配moo {mar}

你应该使用这样的东西:

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

此正则表达式不处理内部花括号

一个变体,使用不情愿的修饰语“。*?” 在正则表达式中。 你可以在这里找到关于正则表达式(贪婪,不情愿,占有欲)的搜索策略的额外信息: http : //javascript.about.com/library/blre09.htm

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

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