可以使用递归正则表达式吗?

时间:2011-02-24 20:18:00

标签: javascript regex

我试图获得一个匹配x开口大括号的javascript正则表达式,然后x关闭大括号,同时允许它们相互嵌套。

例如,它会匹配: “{a {q}}” 但不是 “{a {q} {}” 要么 “{}} {} {”

话虽如此,我不知道如何使用正则表达式,或者甚至可能。

4 个答案:

答案 0 :(得分:3)

对此的简短回答是否定的。正则表达式是non-context-free grammar,因此无法使用真正的正则表达式完成。但是,您可以查找特定(非任意)嵌套模式。

http://blogs.msdn.com/b/jaredpar/archive/2008/10/15/regular-expression-limitations.aspx

这里的递归问题,其核心原因与can't correctly parse HTML with regex相同。与XML一样,您描述的构造是一种无上下文的语法;请注意它与first example from the Wikipedia article非常相似。

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

答案 1 :(得分:2)

真正的正则表达式是不可能的,即使是完整的PCRE,你所描述的“计数问题”也是你不能做的事情的一个例子

我在学校里的一本旧教科书说:“正则表达式无法计算。”使用“{n,m}”限定符的现代“增压”正则表达式实现不是这样,但请注意,花括号中的值有常量。

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

答案 2 :(得分:2)

是的,它可能与Regexes有关。不,在Javascript Regexes中是不可能的。是的,例如,在.NET Regexes中可能有可能(平衡组http://msdn.microsoft.com/en-us/library/bs2twtah(v=vs.71).aspx)。不,我不知道怎么做。他们给我偏头痛(我不是在开玩笑)。他们是非常极端的伏都教。

答案 3 :(得分:2)

AFAIK,你不能只用正则表达式来做这件事。

但是,Javascript的String.replace方法确实有一个很好的功能,可以让你进行一定程度的递归。如果将函数作为第二个参数传递,则将为遇到的每个匹配调用该函数。然后,您可以在该匹配上执行相同的replace,传递相同的函数,该函数将在 匹配等内的每个匹配中调用。

我现在太累了,写出一个符合你所要求的例子 - 或者即使它实际上是可能的,所以我会把它留在这个可能的暗示中,并进一步努力作为练习读者。