Java 不必要的长正则表达式

Java 不必要的长正则表达式,java,regex,Java,Regex,我有一个我想匹配的字符串模式。它可以包含一些用两个大括号括起来的单词。这些花括号必须结构良好,不能嵌套 例如: I have this {{example}} which is right Here {{is}} another {{example}} which is right {{ This {{ example }} is wrong }} {{ This }}example {{ is also { wrong }} 我已经构建了这个正则表达式,它似乎可以工作,但它很长,我认为它可以

我有一个我想匹配的字符串模式。它可以包含一些用两个大括号括起来的单词。这些花括号必须结构良好,不能嵌套

例如:

I have this {{example}} which is right
Here {{is}} another {{example}} which is right
{{ This {{ example }} is wrong }}
{{ This }}example {{ is also { wrong }}
我已经构建了这个正则表达式,它似乎可以工作,但它很长,我认为它可以简化

“^([^{}]*\\{\\\{([^{}]*)\\\\\\\\\}[^{}]*)+$”


有什么方法可以简化这一点吗?

进行负匹配会更容易。也就是说,查找不允许的内容:

\\{\\{[^}]*\\{
和使用。由于同样的原因,尝试用积极的匹配来做到这一点是很困难的

如果你想抓住大括号的内容,这就足够了

\\{\\{(\\w+\\)}\\}

不清楚你所说的“使模式更简单”是什么意思。众所周知,好的图案很长。较短的正则表达式很少精确

在您的例子中,您不应该在字符类中使用带
{
}
符号的转义(您在我的第一个注释之后修复了这个问题),并且表达式中不需要惰性量词,除非您使用捕获的值进行进一步处理。但是,您似乎没有使用它们,因此请使用:

"^([^{}]*\\{\\{([^{}]*)\\}\\}[^{}]*)+$"
见:


你寻求什么样的简化?从字符类中删除
\
,并使所有懒惰的量词贪婪,因为它们在这里的行为相同(请参阅)。@WiktorStribiżew-Whoops,我修复了这个问题。我的意思是简化除了hahaI更新了上面的评论外,你还可以将所有
*?
更改为
*
@WiktorStribiżew,这将使
*
再次贪婪。这不重要吗,因为我有负面角色类?我想知道为什么我和你比较。这取决于您需要对捕获执行什么操作。贪婪的量词工作得更快,因为我相信这里不需要捕获值,所以不需要贪婪的量词。使用
[{][{]\\w+[}][}][}]
@Harald Save在方括号中使用\\;)
String s = "I have this {{example}} which is right";
Pattern pattern = Pattern.compile("^([^{}]*\\{\\{([^{}]*)\\}\\}[^{}]*)+$");
Matcher matcher = pattern.matcher(s);
if (matcher.matches()){
    System.out.println(matcher.group(0)); 
}