Java 如何提取多个花括号之间的元素

Java 如何提取多个花括号之间的元素,java,regex,Java,Regex,我试图在Java上编写一个Regex,用于提取双大括号之间的元素 例如: I am very much new to java...{{envelope|func"{{aa}}{{ds}}|{{abc.xyz}}"}} and i want to know.... more. 我尝试了这个正则表达式,但它没有返回第一个元素full {\{(.*?)(?:\{\{(.*?)\}\})*\}\} 我想摘录如下: 信封| func“{{aa}}{{ds}}{abc.xyz}” aa ds a

我试图在Java上编写一个
Regex
,用于提取双大括号之间的元素

例如:

I am very much new to java...{{envelope|func"{{aa}}{{ds}}|{{abc.xyz}}"}} and i want to know.... more.  
我尝试了这个正则表达式,但它没有返回第一个元素full

{\{(.*?)(?:\{\{(.*?)\}\})*\}\}
我想摘录如下:

  • 信封| func“{{aa}}{{ds}}{abc.xyz}”
  • aa
  • ds
  • abc.xyz

将我的评论转换为答案。这是假设在
{
}
之间,我们有所有非空白字符

这个正则表达式基于lookahead和lookahead内部的交替。捕获的组是前瞻本身的一部分

\{\{(?=((?:(?!\{\{|}})\S)*+|\S*)}})
或在Java中:

final String regex = "\\{\\{(?=((?:(?!\\{\\{|\\}})\\S)*+|\\S*)\\}})";

我通常的建议是:有时必须决定正则表达式是否是一个好的解决方案;或者,如果一个人更好地编写一点自己的解析逻辑。通常:当我需要让别人为我创建正则表达式时,我倾向于不使用正则表达式。因为我可能在将来很难维护那些我一开始就写不下来的东西。除此之外,我甚至不确定是否可以为任意深度的大括号嵌套编写正则表达式。仅供参考:Java正则表达式引擎不支持递归,不能使用正则表达式匹配嵌套的平衡子字符串。您需要编写自己的解析代码。@Jason4Ever:@anubhava,我已经修改了我的全部代码,以用另一种方式解析它。。但是,您的正则表达式运行得非常好。。但是我必须附加最后一个}。。请将其作为对所有人有用的答案发布:)。。谢谢