【问题标题】:regular expression for content within braces大括号内内容的正则表达式
【发布时间】:2009-09-16 00:50:40
【问题描述】:

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

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

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

【问题讨论】:

标签: regex pattern-matching braces


【解决方案1】:

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

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

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

【讨论】:

【解决方案2】:

这很简单,但它找到了一个匹配项:)

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

【讨论】:

  • 不幸的是,我给出的示例是我正在处理的真实数据的简化版本......
【解决方案3】:

正则表达式不能处理嵌套,所以没有正则表达式可以在一般情况下工作。

如果您可以限制最大嵌套深度,您可能可以构造一个表达式来显式检查所有可能的嵌套级别。一般来说,使用某种解析器框架可能会更好。

【讨论】:

  • 种变体允许任意嵌套。
【解决方案4】:

PCRE 正则表达式库可以使用递归来做到这一点:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多