繁体   English   中英

正则表达式以匹配此查询

[英]Regular expression to match this query

我有这样一个句子:

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

我正在使用Java Regular Exp。 像这样(不起作用:当然):

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

实际上,它为我提供了以下输出:

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

我实际上何时想要:“超人X.123 Sr.” 然后是“路易” 除了运行while循环并增加索引外,如何实现? 我可以尝试..但是试图知道是否有更简单的方法被我遗漏。

可能会有更好的正则表达式,但是这个(\\{\\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));
}

那是因为默认情况下量词是贪婪的。 您想要一个懒惰的量词,所以尝试.*? 而不是.*

另外,您可能希望捕获标签本身:

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

请注意,我对Java正则表达式中的反向引用不是100%肯定当前语法,但是应该可以。 您应该在第一个捕获的子模式(在这种情况下为herolover中以标签名称结尾,在第二个子模式中以标签名称结尾。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM