正则表达式入门

对于许多程序员来说,正则表达式是他们用来解决任何类型的文本解析情况的某种神奇剑。但是这个工具并不神奇,即使它的功能很棒,它也不是一个全功能的编程语言( 不是图灵完备的)。

正则表达是什么意思?

正则表达式表达由常规语法定义的语言,该语法可以通过非确定性有限自动机 (NFA) 来解决,其中匹配由状态表示。

一个正规文法是由表达最简单的文法乔姆斯基层次

乔姆斯基的等级制度

简单地说,常规语言通过 NFA 可以表达的内容直观地表达,这是 NFA 的一个非常简单的例子:

NFA 示例

正则表达式语言就是这样一个自动的文本表示。最后一个例子由以下正则表达式表示:

^[01]*1$

哪个匹配任何以 01 开头的字符串,重复 0 次或更多次,以 1 结尾。换句话说,它是一个正则表达式,用于匹配二进制表示中的奇数。

所有正则表达式实际上都是常规语法吗?

实际上他们不是。许多正则表达式引擎已得到改进,并且正在使用下推式自动机 ,它可以堆叠,并在运行时弹出信息。那些自动机在乔姆斯基的层次结构中定义了所谓的无上下文语法 。非常规正则表达式中最典型的用法是使用递归模式进行括号匹配。

像下面这样的递归正则表达式(匹配括号)是这样一个实现的一个例子:

{((?>[^\(\)]+|(?R))*)}

(这个例子不适用于 python 的 re 引擎,但是使用了 regex 引擎 ,或者使用了 PCRE 引擎 )。

资源

有关正则表达式背后理论的更多信息,你可以参考麻省理工学院提供的以下课程:

当你编写或调试复杂的正则表达式时,有一些在线工具可以帮助将正则表达式可视化为自动机,例如 debuggex 站点