首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >匹配此查询的正则表达式

匹配此查询的正则表达式
EN

Stack Overflow用户
提问于 2012-12-06 12:17:58
回答 2查看 56关注 0票数 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”然后是“路易”除了运行while循环和递增索引之外,如何实现这一点?我可以试着说,..but正在尝试了解是否有更容易的方法,但我错过了。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-12-06 12:28:30

可能有更好的正则表达式,但是这个(\{\w+\})([\w\.\s]+)(\{/\w+\})会做您的工作:

代码语言:javascript
运行
复制
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
EN

Stack Overflow用户

发布于 2012-12-06 12:32:28

这是因为默认情况下,量词是贪婪的。如果您想要一个懒惰的量词,那么请尝试使用.*?,而不只是.*

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

代码语言:javascript
运行
复制
Pattern.compile("\\{([^}]+)\\}(.*?)\\{/\1\\}");

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13736882

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档