我有这样一句话:
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循环并增加索引之外,如何实现这一目标?我可以试试..但是试图知道我是否有一种更容易丢失的方式。
答案 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正则表达式中反向引用的当前语法,但这应该有效。您应该在第一个捕获的子模式中使用标记名称(在这种情况下为hero
或lover
),并在第二个子模式中使用名称本身。