0

我有这样一句话:

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循环并增加索引之外,如何实现这一点?我可以试试..但我想知道是否有更简单的方法我错过了。

4

2 回答 2

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));
}
于 2012-12-06T04:28:29.927 回答
0

这是因为量词默认是贪婪的。你想要一个惰性量词,所以尝试.*?而不是.*.

此外,您可能想要捕获标签本身:

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

请注意,我不能 100% 确定 Java 正则表达式中反向引用的当前语法,但这应该可以。您应该在第一个捕获的子模式(herolover在本例中)中使用标签名称,并在第二个子模式中使用名称本身。

于 2012-12-06T04:32:27.560 回答