正则表达式入门
对于许多程序员来说,正则表达式是他们用来解决任何类型的文本解析情况的某种神奇剑。但是这个工具并不神奇,即使它的功能很棒,它也不是一个全功能的编程语言( 即它不是图灵完备的)。
正则表达是什么意思?
正则表达式表达由常规语法定义的语言,该语法可以通过非确定性有限自动机 (NFA) 来解决,其中匹配由状态表示。
一个正规文法是由表达最简单的文法乔姆斯基层次 。
简单地说,常规语言通过 NFA 可以表达的内容直观地表达,这是 NFA 的一个非常简单的例子:
而正则表达式语言就是这样一个自动的文本表示。最后一个例子由以下正则表达式表示:
^[01]*1$
哪个匹配任何以 0
或 1
开头的字符串,重复 0 次或更多次,以 1
结尾。换句话说,它是一个正则表达式,用于匹配二进制表示中的奇数。
所有正则表达式实际上都是常规语法吗?
实际上他们不是。许多正则表达式引擎已得到改进,并且正在使用下推式自动机 ,它可以堆叠,并在运行时弹出信息。那些自动机在乔姆斯基的层次结构中定义了所谓的无上下文语法 。非常规正则表达式中最典型的用法是使用递归模式进行括号匹配。
像下面这样的递归正则表达式(匹配括号)是这样一个实现的一个例子:
{((?>[^\(\)]+|(?R))*)}
(这个例子不适用于 python 的 re
引擎,但是使用了 regex
引擎 ,或者使用了 PCRE 引擎 )。
资源
有关正则表达式背后理论的更多信息,你可以参考麻省理工学院提供的以下课程:
当你编写或调试复杂的正则表达式时,有一些在线工具可以帮助将正则表达式可视化为自动机,例如 debuggex 站点 。