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

3
我将尝试在Java上编写一个正则表达式,以提取双花括号之间的元素。
例如:
I am very much new to java...{{envelope|func"{{aa}}{{ds}}|{{abc.xyz}}"}} and i want to know.... more.  

我尝试了这个正则表达式,但它没有返回第一个完整元素。
{\{(.*?)(?:\{\{(.*?)\}\})*\}\}

我想提取如下所示的内容:

  • envelope|func"{{aa}}{{ds}}|{{abc.xyz}}"
  • aa
  • ds
  • abc.xyz

8
我的通常建议是:有时候需要决定正则表达式是否是一个好的解决方案;或者是否最好自己编写一些解析逻辑。通常情况下,如果我需要请求别人创建正则表达式,我往往不使用正则表达式。因为将来可能难以维护那些一开始无法编写的内容。除此之外,我甚至不确定你是否能够为任意深度的括号嵌套编写正则表达式。 - GhostCat
2
请注意:Java正则表达式引擎不支持递归,因此您不能使用正则表达式来匹配嵌套的平衡子字符串。您需要编写自己的解析代码。 - Wiktor Stribiżew
@Jason4Ever:这个对你管用吗? - anubhava
1
@anubhava,我已经修改了整个代码以另一种方式进行解析。然而,你的正则表达式非常有效。但是我必须添加最后一个}}。请将其作为答案发布,以便对所有人有用:)。谢谢 - Jason4Ever
1个回答

2

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

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

\{\{(?=((?:(?!\{\{|}})\S)*+|\S*)}})

或者在Java中:

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

RegEx Demo


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接