在通用正则表达式中,没有办法很好地处理嵌套。因此,当出现这样的问题时,所有的胜利 - 永远不要使用正则表达式来解析 XML/HTML。
在一些简单的情况下,它可能是有利的。如果像在您的示例中那样,嵌套级别的数量有限,您可以非常简单地为每个级别添加一个正则表达式。
现在让我们分步进行。要处理第一个未嵌套的属性,您可以使用
{[^}]*}
这匹配一个起始大括号,后跟除右大括号外的任意数量,最后是一个右大括号。为简单起见,我将把它的核心放在一个非捕获组中,比如
{(?:[^}])*}
这是因为在插入备用的时,它是必需的。
如果您现在允许除了右大括号( [^}]
) 之外的任何其他内容也可以是另一个嵌套级别的大括号,并且只需加入第一个正则表达式,例如
{(?:{[^}]*}|[^}])*}
^^^^^^^ original regex inserted as alternative (to it self)
它允许一级嵌套。再次做同样的事情,加入这个正则表达式作为自身的替代,比如
{(?:{(?:{[^}]*}|[^}])*}|{[^}]*}|[^}])*}
^^^^^^^^^^^^^^^ previous level repeated
将允许另一个级别的嵌套。如果需要,这可以重复更多级别。
这不处理属性名称和东西的捕获,因为你的问题不是很清楚你想要什么,但它向你展示了一种处理方式(imo最容易理解,或者......:P)嵌套在正则表达式中。
您可以在 regex101 看到它处理您的示例。
问候