我有这样一句话:
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”然后是“路易”除了运行while循环和递增索引之外,如何实现这一点?我可以试着说,..but正在尝试了解是否有更容易的方法,但我错过了。
发布于 2012-12-06 12:28:30
可能有更好的正则表达式,但是这个(\{\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-06 12:32:28
这是因为默认情况下,量词是贪婪的。如果您想要一个懒惰的量词,那么请尝试使用.*?
,而不只是.*
。
此外,您可能想要捕获标记本身:
Pattern.compile("\\{([^}]+)\\}(.*?)\\{/\1\\}");
请注意,我不能100%确定Java正则表达式中反向引用的当前语法,但这应该可以工作。您应该在第一个捕获的子模式(本例中为hero
或lover
)中使用标记名,在第二个子模式中使用名称本身。
https://stackoverflow.com/questions/13736882
复制相似问题