在这里SO人们有时会说“你不能用正则表达式解析X,因为X不是常规语言”。然而,根据我的理解,现代正则表达式引擎可以匹配Chomsky's sense中的常规语言。我的问题:
给出支持
的正则表达式引擎(?R)
它可以解析哪种语言?它可以解析任何无上下文的语言,如果没有,那会是什么样的反例?
(确切地说,“解析”是指“构建一个接受语法X生成的所有字符串并拒绝所有其他字符串的单个正则表达式”。)
添加:我特别感兴趣的是看到现代正则表达式引擎(Perl,Net,python正则表达式模块)无法解析的无上下文语言的示例。
答案 0 :(得分:18)
我最近写了一篇关于这个话题的长篇文章:The true power of regular expressions。
总结:
a^n b^n
)。ww
和a^n b^n c^n
)。一些例子:
匹配无上下文的语言{a^n b^n, n>0}
:
/^(a(?1)?b)$/
# or
/^ (?: a (?= a* (\1?+ b) ) )+ \1 $/x
匹配上下文相关语言{a^n b^n c^n, n>0}
:
/^
(?=(a(?-1)?b)c)
a+(b(?-1)?c)
$/x
# or
/^ (?: a (?= a* (\1?+ b) b* (\2?+ c) ) )+ \1 \2 $/x
答案 1 :(得分:8)
现代正则表达式引擎当然可以解析比常规语言集更大的语言集。所以说,四个经典的乔姆斯基集合中没有一个被正则表达式完全识别。正则表达式清楚地识别所有常规语言。有一些经典的无上下文语言无法被正则表达式识别,例如平衡括号语言a^n b^n
,除非有可用的计数反向引用。但是,正则表达式可以解析对上下文敏感的语言ww
。
实际上,形式语言理论中的正则表达式只与正则表达式有轻微关系。在最一般的情况下,具有无限反向引用的匹配正则数是NP-Complete,因此对于足够强大的正则表达式的所有模式匹配算法都是指数的,至少在一般情况下是如此。然而,对于大多数输入而言,它们都非常快。众所周知,匹配无上下文的语言最多比n^3
更快,因此正则表达式中的某些语言不是无上下文的(如ww
),但并非所有无上下文的语言都可以由正则表达式解析。类型0语言通常是不可判定的,儿子正则表达式不能到达那里。
因此,作为一个不太确凿的结论,正则表达式可以解析包含所有常规语言的广泛语言,以及一些无上下文和上下文敏感的语言,但它并不完全等于任何这些集合。还有其他类别的语言和其他分类法,您可以在其中找到更精确的答案,但是没有包含无上下文语言的分类法作为语言层次结构中的适当子集可以提供由正则表达式准确识别的单一语言,因为正则表达式只在某些部分与无上下文语言相交,而且两者都不是另一部分的适当子集。
答案 2 :(得分:2)
您可以在 An Introduction to Language And Linguistics By Ralph W. Fasold, Jeff Connor-Linton P.477
中阅读有关正则表达式的信息乔姆斯基等级:
Type0> = Type1> = Type2> = Type3
计算语言学主要以2型和2型为特色。 3个语法
•键入3个语法:
-Include 正则表达式和有限状态自动机(又名有限状态机)
- 本次演讲其余部分的重点
• Type 2 grammars :
- 通常用于自然语言解析器
- 用于模拟许多语言学理论中的句法结构(通常由其他机制补充)
- 我们将在接下来的解析演讲中发挥关键作用。
这三个答案可能有用:
1 - does-lookaround-affect-which-languages-can-be-matched-by-regular-expressions
3 - where-do-most-regex-implementations-fall-on-the-complexity-scale