Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 匹配此查询的正则表达式_Java_Regex - Fatal编程技术网

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

Java 匹配此查询的正则表达式,java,regex,Java,Regex,我有这样一句话: 嗯,{英雄}超人X.123 Sr.{/英雄},最可爱的男人被{情人}路易斯{/情人}憎恨 我正在使用java正则表达式,如下所示(当然不起作用): Pattern search=Pattern.compile(“}.*{\/” 实际上,它为我提供了以下输出: 超人X.123 Sr.{/英雄},最可爱的男人被{情人}路易斯{/ 实际上我想要的是:“超人X.123 Sr.”然后是“路易斯”。除了运行while循环并增加索引外,如何实现这一点呢?我可以试试。但我想知道是否有一种更简单

我有这样一句话:

嗯,{英雄}超人X.123 Sr.{/英雄},最可爱的男人被{情人}路易斯{/情人}憎恨

我正在使用java正则表达式,如下所示(当然不起作用):

Pattern search=Pattern.compile(“}.*{\/”

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

超人X.123 Sr.{/英雄},最可爱的男人被{情人}路易斯{/


实际上我想要的是:“超人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%的把握,但这应该是可行的。您应该在第一个捕获的子模式(
hero
lover
)中使用标记名,在第二个子模式中使用名称本身。

{1}
是一个不可操作的操作,浪费了三个字节和一个完整的操作。默认情况下,所有内容都被量化为1,因此指定数量1是多余的。@Kolink:谢谢。不确定,没有它就不能工作,所以我把它放进去,但现在当我尝试时,它工作了:(.将其从答案中删除。抱歉:在查看文档时,我对查询做了一些更改。我不知道您已响应。@Knight我更新了正则表达式以包含
空格
字符。似乎正在处理您更新的字符串。请尝试告诉我。