正则表达式和嵌套模式:最终的答案是什么?

时间:2014-03-12 18:34:25

标签: regex

这里question and its answers表明两者都是:

  1. 可以使用正则表达式匹配嵌套模式。

  2. 并且这是不可能的,因为嵌套模式不是常规语言 因此,DFA(正则表达式)无法识别它们。

  3. 在阅读上述问题的答案(https://stackoverflow.com/a/3851098/2876289)之前,我会一直站在2.现在我不太确定。

    可以'/(\((?>[^()]+|(?1))*\))/'

    真的匹配嵌套模式吗?

    被问到 - 我在vim(和JavaScript)中尝试了上述内容并且它不起作用。虽然它可能需要转换为不同的语法。引用它的答案有9个赞成票。

1 个答案:

答案 0 :(得分:4)

你必须区分三件事:

  1. 正则表达式的实现,具有处理嵌套事物的功能。
  2. 没有这些功能的正则表达式的实现
  3. "正则表达"在理论上意义
  4. 案例1:我知道两个可以处理嵌套括号(或其他内容)的功能

    • 引用捕获组的子模式的能力,就是您的示例:

      (\((?>[^()]+|(?1))*\))

    (?1)指的是捕获组1(在其自身内部获取递归)

    这个功能在PCRE正则表达式引擎(PHP,R),Ruby(带有oniguruma语法),Perl,Python的新正则表达式模块,javascript的libReost库,libboost ...

    • 堆栈系统,如.net:

      (?:[^()]|(?<Open>[(])|(?<-Open>[)]))*(?(Open)(?!))

    (请查看this excellent post了解更多信息。)

    案例2:不具备以下功能的实现:Javascript,Python的重新模块,Java ...

    案例3:在理论上的含义&#34;正则表达&#34;是对常规语言的描述。由于未确定的嵌套级别不是常规语言,因此无法使用正则表达式来描述#34;。然而,重要的一点是,这种接受术语的正则表达式&#39;与“正则表达式”这个术语没什么关系。 (或正常表达&#39;),因为它是常用的,这是对语言的误用。