这里question and its answers表明两者都是:
可以使用正则表达式匹配嵌套模式。
并且这是不可能的,因为嵌套模式不是常规语言 因此,DFA(正则表达式)无法识别它们。
在阅读上述问题的答案(https://stackoverflow.com/a/3851098/2876289)之前,我会一直站在2.现在我不太确定。
可以'/(\((?>[^()]+|(?1))*\))/'
真的匹配嵌套模式吗?
被问到 - 我在vim(和JavaScript)中尝试了上述内容并且它不起作用。虽然它可能需要转换为不同的语法。引用它的答案有9个赞成票。
答案 0 :(得分: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;),因为它是常用的,这是对语言的误用。