顾名思义,我们可能认为正则表达式只能匹配常规语言。但是我们在实践中使用的正则表达式包含的东西我不确定它们是否可以与理论对应物一起实现。例如,如何模拟反向引用?
所以问题出现了:我们在实践中使用的正则表达式的理论力量是什么?你能想出一种匹配{(a^n)(b^n)|n>=0}
的方法吗?那么{(a^n)(b^n)(c^n)|n>=0}
呢?
答案 0 :(得分:6)
你的问题的答案是,“正则表达式”语言允许反向引用既不是常规的也不是无上下文的。 (换句话说,正如你所指出的那样,你不能用常规语言模拟反向引用,也不能用CFL模拟。)实际上,维基百科说我们在实践中使用的许多“正则表达式”语言都是NP-Complete :
与无界模式匹配 返回引用的数量,如 许多现代工具支持,是 NP-complete(参见
[11]
定理6.2)。
正如其他人所建议的那样,计算机语言和图书馆通常支持的正则表达式语言与形式语言理论中的正则表达式不同。 Larry Wall wrote关于Perl“regexes”,
'正则表达式'[...]仅限 与实际常规略有关系 表达式。尽管如此,这个词 随着我们的能力而增长 模式匹配引擎,所以我不是 打算尝试与语言作斗争 这里有必要。但是,我会 通常称他们为“正则表达式”
你问,
你能想出一种匹配方式 {(一^ N)(B ^ N)| N> = 0}?关于什么 {(一^ N)(B ^ n)的(C ^ N)| N> = 0}?
我不确定这里是否你试图测试理论正则表达式语言是否可以匹配“正方形语言”,或者你是否在(实用)正则表达式语言。对于java正则表达式Here's the proof why the former is not possible;和here's a long explanation and implementation of the latter。
答案 1 :(得分:4)
正如你所暗示的正则表达式的基本难点是正则表达式没有“记忆”。在最纯粹的形式中,没有真正的正则表达式应该能够识别这些语言中的任何一种。根据定义,任何可以解析这些语言的正则表达式都不是常规的。我认为“我们使用的正则表达式是练习”的意思是扩展正则表达式,这在技术上不是正则表达式。
你的问题的问题在于你要求将一个特别设计的理论场景应用于实际情况,这几乎总是以灾难结束。
所以我的答案是一种非答案,因为我说你必须重新提问这个问题才能提出扩展正则表达式,以便得到答案。
可能有助于解决此问题的一些资源:
Similar StackOverflow question
Good book with a chapter on this topic
我也正在为其他想要为这一思路做出贡献的人提供社区维基。