大括号内容的正则表达式

时间:2009-09-16 00:50:40

标签: regex pattern-matching braces

是否有正则表达式来匹配大括号内的内容。例如,具有以下内容:

d = {'key': {'a': [1,2,3]}}

我想匹配 {'key':{'a':[1,2,3]}} {'a':[1,2,3] } ,但不是 {'key':{'a':[1,2,3]}

4 个答案:

答案 0 :(得分:4)

在经典正则表达式中,这是不可能的--DFA无法解析嵌套对。

有一些方法可以使用扩展的正则表达式,例如某些正则表达式引擎(例如Perl正则表达式)中允许的递归表达式,但它们并不总是很漂亮。 (太多的php 提供了Perl版本:/\{(?:[^{}]+|(?R))*\}/,其中(?R)选项是递归匹配。)

你不一定需要正则表达式来做这种事情。你可以简单地通过遍历列表并保持一堆开放的大括号(以及他们在什么位置看到)来做到这一点。然后每当你看到一个打开的大括号时,你将它的位置推到堆栈上,每当你看到一个紧密的大括号时,你会从堆栈中弹出最近看到的开放大括号,并使用它的位置加上当前位置作为子串的边界这成为你的比赛之一。重复,直到到达字符串的末尾。

答案 1 :(得分:1)

这很简单,但找到了匹配:)

{'key': {'\w+': \[[\w,]*\w\]}}

答案 2 :(得分:0)

正则表达式无法处理嵌套,因此没有正则表达式可以在一般情况下使用。

如果可以限制最大嵌套深度,则可以构造一个表达式,该表达式明确检查所有可能的嵌套级别。通常,您最好使用某种解析器框架。

答案 3 :(得分:0)

PCRE正则表达式库可以使用递归来执行此操作:

/\{(?:[^{}]+|(?R))*\}/