正则表达式能用于匹配嵌套模式吗?
正则表达式是否能用于匹配嵌套模式?
问题的出现原因是因为作者想要找到一个解决方案,能够在字符串中匹配嵌套的模式。
在给出的代码中,作者使用了Perl语言的正则表达式来实现这个功能。代码中定义了一个变量$NesteD,并使用qr//操作符将其赋值为一个正则表达式。这个正则表达式用于匹配一个大括号内部的内容,包括其中可能包含的嵌套的大括号。
接下来,作者使用m//操作符将字符串$Stringy与正则表达式进行匹配。如果匹配成功,打印出匹配到的结果。
还有一些相关的链接,包括Perl 6的一篇RFC、关于Ruby的信息、更多的Perl示例及相关文档。
最后,还有一个重要的事实,即Perl的“正则表达式”实际上并不是真正的正则表达式,而是一种扩展的语法。并且,作者指出,尽管可以使用递归的正则表达式来实现这个需求,但在解析HTML等常见场景中,通常不建议使用这种方法。
作者提出了一个问题,即如何使用正则表达式匹配嵌套的模式。通过给出的Perl代码示例,展示了实现这个功能的一种可能的解决方案。同时,还有一些相关的链接和说明,以帮助读者深入了解和学习更多关于正则表达式的知识。
正则表达式可以用来匹配嵌套模式吗?这个问题的出现是因为使用正则表达式来检查嵌套模式非常容易。但是,使用PHP 5.2的(?>...)
原子组语法的一个问题是,?>
部分被解释为"脚本结束"!以下是我会写的方法:/\((?:[^()]++|(?R))*+\)/
。这对于匹配和非匹配都更加高效。在其最简形式/\(([^()]|(?R))*\)/
中,它真的是一件美妙的事情!Double +?
我使用(?1)
允许在其他文本中存在注释(我从我的电子邮件地址正则表达式中提取并简化了它)。(?>
的使用是因为我认为它可以更快地失败(如果需要的话)。这不正确吗?尝试使用/^(\((?>[^()]+|(?1))*\))+$/
和/^\([^()]*\)+$/
来匹配(a (b c))(d e)
。前者匹配但后者不匹配。您的解决方案对我有效。但我只是想知道?>
和?:
之间有什么区别?我尝试了两种方法,它们都似乎有效。它使其成为一个原子组,并用于防止灾难性回溯。对于这个问题,终于找到了一个关心并愿意解释的人:stackoverflow.com/questions/26385984,或者在这里:rachbelaid.com/recursive-regular-experession,甚至更好的是:rexegg.com/regex-recursion.html。这个使用?1
的解决方案在(*SKIP)(*FAIL)
中起作用,而?R
方法则不起作用。我在这里创建了一个示例:regex101.com/r/xkVzVP/1。
可以使用正则表达式来匹配嵌套模式吗?这个问题的出现是因为正则表达式所基于的有限自动机数据结构除了当前状态之外没有记忆能力。如果存在任意深度的嵌套,就需要一个任意大的自动机,这与有限自动机的概念相冲突。
您可以匹配嵌套/成对的元素,深度仅受内存限制,因为自动机会变得非常大。然而,在实践中,您应该使用下推自动机,即上下文无关文法的解析器,例如自上而下的LL或自下而上的LR。您必须考虑更糟糕的运行时行为:O(n^3)与O(n),其中n = 输入长度。
有许多可用的解析器生成器,例如Java的ANTLR。找到现有的Java(或C)语法也不难。
有关更多背景信息,请参阅维基百科上的Automata Theory。
Torsten在理论上是正确的。实际上,许多实现都有一些技巧,以使您能够执行递归的“正则表达式”。例如,请参阅php.net/manual/en/regexp.reference.php中的“递归模式”一章。
我在自然语言处理和其中包含的自动机理论方面受到了宠爱。
一个清晰明了的答案。我见过的最好的“为什么不”。
语言理论中的正则表达式和实践中的正则表达式是不同的...因为“正则”的表达式不能包含诸如反向引用、向前引用等等的技巧。
“一个有限自动机(它是正则表达式的数据结构)除了当前状态之外没有记忆能力,如果您有任意深度的嵌套,您需要一个任意大的自动机,这与有限自动机的概念相冲突。”- 迄今为止,我见过的关于这个话题的最佳答案。
-您能确认这仍然是正确的吗?其他资料表明,如果正则表达式引擎支持反向引用等功能,它将成为二类文法(上下文无关)而不是三类(正则文法)。因此,例如PCRE能够处理嵌套结构。混淆的原因在于现实世界中的“正则表达式”不再是技术意义上的正则。如果这是正确的,更新此答案将是很好的。
有一种方法可以实现这一点,但它不会纯粹使用正则表达式。您需要匹配每个括号/方括号/括号实例(全局),然后使用某种编程语言在父级内递归替换/标记嵌套的匹配项。
这个答案超出了我的理解能力。然后我找到了一个可行的正则表达式:drregex.com/2017/11/match-nested-brackets-with-regex-new.html
更正...该正则表达式在大多数情况下有效。
2021年对2008年的帖子进行更正:请参见php.net/manual/en/regexp.reference.recursive.php。