正则表达式匹配此查询

时间:2012-12-06 04:17:58

标签: java regex

我有这样一句话:

Well, {hero}Superman X. 123 Sr.{/hero}, the most lovable guy was hated by {lover}Louis{/lover}.

我正在使用java常规exp。像这样(当然不起作用):

Pattern search = Pattern.compile("}.*{\/")

实际上它为我提供了这个输出:

}Superman X. 123 Sr.{/hero}, the most lovable guy was hated by {lover}Louis{/

当我想要的时候:“超人X. 123 Sr.”然后是“路易斯”。除了运行while循环并增加索引之外,如何实现这一目标?我可以试试..但是试图知道我是否有一种更容易丢失的方式。

2 个答案:

答案 0 :(得分:1)

可能有一个更好的正则表达式,但这个(\{\w+\})([\w\.\s]+)(\{/\w+\})可以帮助您完成工作:

String test = "Well, {hero}Superman X. 123 Sr.{/hero}, the most lovable guy"+
                  " was hated by {lover}Louis{/lover}.";
Pattern p = Pattern.compile("(\\{\\w+\\})([\\w\\.\\s]+)(\\{/\\w+\\})");
Matcher m = p.matcher(test);
while(m.find()){
    System.out.println(m.group(2));
}

答案 1 :(得分:0)

这是因为默认情况下量词是贪婪的。您需要一个惰性量词,因此请尝试.*?而不是.*

此外,您可能希望捕获标记本身:

Pattern.compile("\\{([^}]+)\\}(.*?)\\{/\1\\}");

请注意,我不是100%肯定Java正则表达式中反向引用的当前语法,但这应该有效。您应该在第一个捕获的子模式中使用标记名称(在这种情况下为herolover),并在第二个子模式中使用名称本身。