匹配花括号内非嵌套花括号的正则表达式

3
我现在正在使用{([^}]*)}来匹配花括号内的内容,但是如果我在其中添加其他闭合花括号,它就无法工作了。我希望双花括号可以像其他文本一样作为匹配组的一部分,并且嵌套在其中,而不是作为单独的匹配或子匹配(不递归)。
{
    <div>
    works
    </div>
}

{
    <div>
    {{fails}}
    </div>
}

这是我目前拥有的实时示例:http://regex101.com/r/pT5fA1/4。如有建议或意见,请不吝赐教。
1个回答

5
我想你正在寻找的是:

我认为您正在寻找以下内容:

{((?:[^{}]|{{[^}]*}})*)}

模式详情:

{(
(?:               # non capturing group
    [^{}]         # all that is not a curly bracket
  |               # OR
    {{[^}]*}}     # a string inside double curly brackets
)*                # zero or more times
)}

更加高效的方法是使用原子组

{((?>[^{}]+|{{[^}]*}})*)}

很不幸,Javascript没有这个功能。但是您可以使用一个技巧来模拟它,该技巧利用了前瞻的内容自然上下文无关性。
{((?:(?=([^{}]+|{{[^}]*}}))\2)*)}

太棒了!非常感谢。我已经试了好几个小时了。有一个快速问题,可能不可能,但是是否有一种使用这种布局的方法,也允许在主捕获组中随机使用括号? - Matthew
@Matthew: 你无法使用JavaScript的正则表达式来实现,因为它没有递归功能。解决的方法是解析字符串,并在遇到花括号时增加和减少一个变量。当变量等于零时,表示花括号是平衡的。 - Casimir et Hippolyte
我早就猜到了。谢谢你的建议和上面的模式。非常感激! - Matthew

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