【问题标题】:Regular expression to match content within curly braces without nested braces breaking it正则表达式匹配大括号内的内容,而没有嵌套大括号破坏它
【发布时间】:2014-08-01 03:07:52
【问题描述】:

我目前正在使用 {([^}]*)} 匹配一组花括号中的内容,但是一旦我在其中添加关闭其他花括号,它就会停止工作。

我基本上希望双花括号充当任何其他文本,并与它嵌套的匹配组分开,不是单独的匹配或子匹配(非递归)

{
    <div>
    works
    </div>
}

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

这是我目前拥有的一个活生生的例子:http://regex101.com/r/pT5fA1/4

任何建议或意见将不胜感激。

【问题讨论】:

    标签: javascript regex


    【解决方案1】:

    我认为您正在寻找:

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

    图案细节:

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

    一种更有效的方法是使用atomic group

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

    很遗憾,Javascript 没有此功能。但是您可以使用一个技巧来模拟它,即先行的内容自然是原子的:

    {((?:(?=([^{}]+|{{[^}]*}}))\2)*)}
    

    【讨论】:

    • 漂亮!非常感谢。已经尝试了几个小时。快速提问,可能不太可能,但是有没有一种方法可以使用这种布局,也允许在主要捕获组中使用随机括号?
    • @Matthew:你不能使用 javascript 正则表达式,因为它没有递归功能。这样做的方法是解析字符串并在遇到大括号时增加和减少变量。当变量为零时,大括号是平衡的。
    • 我想的也差不多。感谢您的建议和上述模式。真的很感激!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-02
    • 1970-01-01
    • 2011-07-18
    相关资源
    最近更新 更多