我想提取用大括号括起来的所有单词,所以我有一个像这样的表达式
foo {bar} moo {mar}
要匹配的字符串可能包含任意数量的这些单词,但我开始认为我正以错误的方式处理此问题。
我的尝试
我试图将大括号分成几组,这样我就可以使用每一个匹配。所以,我做了一个正则表达式:
String rx = ".*\\{({GROUP}\\w+)\\}.*";
注意:我正在使用JRegex语法,所以我需要逃避一些问题。
结果
我得到的结果是单个(尽管是正确的)匹配bar
,而我期望两个匹配bar
和mar
。我误解了什么,我该如何纠正呢?我可能需要为.
部分使用其他量词,但我希望你也可以帮助我。
非常感谢提前!
答案 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,我更喜欢使用不情愿的搜索而不是字符排除...