regex - 可以使用正则表达式来匹配嵌套模式吗?

标签 regex nested finite-automata

是否可以编写一个正则表达式来匹配出现次数未知的嵌套模式?例如,当外大括号内嵌套未知数量的左大括号时,正则表达式是否可以匹配左大括号和右大括号?

例如:

public MyMethod()
{
  if (test)
  {
    // More { }
  }

  // More { }
} // End

应该匹配:

{
  if (test)
  {
    // More { }
  }

  // More { }
}

最佳答案

没有。就是这么简单。有限自动机(正则表达式底层的数据结构)除了其所处状态之外没有内存,如果您有任意深度的嵌套,则需要一个任意大的自动机,这与 的概念相冲突有限自动机。

您可以将嵌套/配对元素匹配到固定深度,其中深度仅受您的内存限制,因为自动机变得非常大。然而,在实践中,您应该使用下推自动机,即上下文无关语法的解析器,例如 LL(自上而下)或 LR(自下而上)。您必须考虑到更糟糕的运行时行为:O(n^3) 与 O(n),其中 n = length(input)。

有许多可用的解析器生成器,例如 ANTLR对于Java。查找 Java(或 C)的现有语法也不难。
了解更多背景:Automata Theory在维基百科

关于regex - 可以使用正则表达式来匹配嵌套模式吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59613717/

相关文章:

computer-science - 学习计算模型的好资源?

parsing - 测试两种常规语言的交集

java - 从字符串中删除字符: Regular expression or Manually

python - 从嵌套的字典python中获取键值

java - 提供的正则表达式匹配什么?

python - 使用 Marshmallow 的嵌套模式自动字典键解析

python:在嵌套字典中查找匹配值

finite-automata - DFA,NFA,PDA和图灵机在现实世界中的使用

java - 从字符串中提取阿拉伯语单词(不是语义阿拉伯语短语)

javascript - 正则表达式接受正数和负数