Javascript 递归正则表达式是否存在?

Javascript 递归正则表达式是否存在?,javascript,regex,Javascript,Regex,我试图得到一个javascript正则表达式,它匹配x个开始大括号,然后是x个结束大括号,同时允许它们相互嵌套 例如,它将匹配: “{a{q}” 但不是 “{a{q}{}” 或 “{}{}{}{” 也就是说,我不知道如何使用regexpes,或者它是否可行。这在真正的正则表达式中是不可能做到的,即使是完全成熟的PCRE,您描述的“计数问题”就是一个您无法做到的例子 我在学校读过一本旧教科书,上面说“正则表达式不能计数”。对于带有“{n,m}”限定符的现代“超级”正则表达式实现来说,情况并非如此,

我试图得到一个javascript正则表达式,它匹配x个开始大括号,然后是x个结束大括号,同时允许它们相互嵌套

例如,它将匹配: “{a{q}” 但不是 “{a{q}{}” 或 “{}{}{}{”


也就是说,我不知道如何使用regexpes,或者它是否可行。

这在真正的正则表达式中是不可能做到的,即使是完全成熟的PCRE,您描述的“计数问题”就是一个您无法做到的例子

我在学校读过一本旧教科书,上面说“正则表达式不能计数”。对于带有“{n,m}”限定符的现代“超级”正则表达式实现来说,情况并非如此,但请注意,大括号中的值是常量


要做到这一点,您需要一个更复杂的自动机。上下文无关语法可以表示您所描述的语言,也可以表示解析表达式语法。

对此的简短回答是否定的。正则表达式是a,因此不能使用真正的正则表达式。但是,您可以查找特定(非任意)嵌套模式

这里的递归问题的核心是与您相同的原因。与XML一样,您描述的构造是一种上下文无关的语法;请注意它与XML非常相似


我听说有一些引擎可以扩展正则表达式以提供对任意嵌套元素的支持,但这会使它们成为真正的正则表达式以外的东西。无论如何,我不知道有任何这样的JavaScript库。我想你需要的是某种基于字符串操作的解析器。

是的,正则表达式可能有这种可能。否,这在Javascript正则表达式中是不可能的。是的,它可能在.NET正则表达式中是可能的,例如(平衡组)。不,我不知道怎么做。它们会让我头痛(我不是开玩笑的)。它们是非常极端的巫毒教。

好吧,uou不能仅用正则表达式来实现这一点

但是,Javascript的方法确实有一个很好的特性,可以允许您进行某种程度的递归。如果您将函数作为第二个参数传递,则将为遇到的每个匹配调用该函数。然后您可以对该匹配执行相同的
replace
,传递相同的函数,该函数将为每个matc调用h在那场比赛中,等等


我现在太累了,写不出一个符合你要求的例子——或者即使它实际上是可能的,所以我将把它放在这个可能的提示下,作为一个练习给读者。

但是如果这是真的……我们如何用正则表达式解析XML?;)这确实是一个很深的谜,@harpo@harpo你让我走了il the smiley^^^^这在一些语言中是可能的,比如现代Perl——但不是JavaScript:-)然而,(从更多的“学术观点”来看)是那些接受常规语言的语言,简言之,“不能计算”。@pst这应该是公认的问题。+1用于提供两个术语之间的明确区别(通常会让程序员感到困惑的术语)。我并不认为文档中描述的正则表达式可以计算括号。@Pointy搜索S.O.“tchrist”以查看Perl正则表达式可以做什么(我不是建议它们应该做什么)@你可以想什么就想什么,但他们可以做到……读了这篇文章,你会感到偏头痛,他们甚至可以做“多层次不同”的平衡小组([])。你可以阅读这篇文章来引用
一般来说,正则表达式不可能做到这一点,然后
然而在.Net中,平衡组定义实际上可以做到这一点。
承认我鄙视正则表达式会让我在这里成为贱民吗?它们违反了编写可理解代码的所有原则。但它们仍然让我着迷……就像巫毒一样。@xanatos,我喜欢使用正则表达式。其他人编写的正则表达式。是的,这真的是缺少调试器,就像用十六进制编写机器代码。有人能发明一个带有人类可理解术语的正则表达式包装器和调试器吗?“[JavaScript中的]正则表达式是一个…”:-)@pst:我的理解是,这适用于任何“纯”正则表达式,但我始终欢迎更正。@Justin,不管它是否是上下文无关语法。{a^nb^n}语言是上下文无关语言,可以用正则表达式(当然,我们通常在某些编程语言中使用的正则表达式)进行解析.记住,我们在用C#等语言编程时使用的正则表达式与理论正则表达式不同,这一点非常重要,这就是为什么人们不能说某些东西不能用正则表达式解析,因为它不是正则语言。程序员不必知道真正的正则表达式是什么ion是(我想他们一定是!)@Oscar:嗯,我想你对理论正则表达式的概念就是我用“纯”或“真”来表达的正则表达式。如果语言是上下文无关的,并且可以包含递归嵌套的开/闭分隔符,并且必须相互平衡,那么我的理解是,不能在纯正则表达式中完成。我不是说不能在扩展正则表达式的引擎中完成,但这取决于引擎,因为从严格意义上讲,它不再是正则表达式从道理上讲,我认为这超出了问题的范围。@Justin好的,明白了。我同意你的观点,但我想解释的是,有时候人们只是想用正则表达式解决一个特定的问题,而不知道正则表达式或正则语言的正式定义是什么。在向其他人提出建议时,考虑到这一点很重要()