正则表达式
正则表达式,又称规则表达式,是一种文本模式,通常用来检索、替换和控制文本。主要包括a 到 z 的字母以及一些特殊的元字符。
正则表达式的应用范围非常之广泛,最初是由Unix普及开来的,后来在广泛运用于Scala 、PHP、C# 、Java、C++ 、Objective-c、Perl 、Swift、VBScript 、Javascript、Ruby 以及Python等等。
学习正则表达式,实际上是在学习一种十分灵活的逻辑思维,联系通过简单快速的方法达到对于字符串的控制。也许跟如此多的程序语言挂钩看起来有些生涩难懂,但是它也能够很轻松地在Microsoft Word上实现。
本书从简单的文本匹配开始,循序渐进地介绍了很多复杂内容,其中包括回溯引用、条件性求值和前后查找,等等。通过简单的描述和精彩的实例帮助读者系统全面地掌握正则表达式,并运用它们去解决实际问题。诸位必须知道正则表达式是程序员手中一把威力无比强大的武器,学会它,可以用来处理大部分的程序语言。
无论你在使用何种语言,都可以备一本《正则表达式》随时查阅。
学完本教程,进行实战练习,才算真正掌握哦:点击开始实战
正则表达式的起源
正则表达式的“鼻祖”或许可一直追溯到科学家对人类神经系统工作原理的早期研究。美国新泽西州的Warren McCulloch和出生在美国底特律的Walter Pitts这两位神经生理方面的科学家,研究出了一种用数学方式来描述神经网络的新方法,他们创造性地将神经系统中的神经元描述成了小而简单的自动控制元,从而作出了一项伟大的工作革新。
在1956 年,一位名叫Stephen Kleene的数学科学家发表了一篇题目是《神经网事件的表示法》的论文,利用称之为正则集合的数学符号来描述此模型,引入了正则表达式的概念。正则表达式被作为用来描述其称之为“正则集的代数”的一种表达式,因而采用了“正则表达式”这个术语。
之后一段时间,人们发现可以将这一工作成果应用于其他方面。Ken Thompson就把这一成果应用于计算搜索算法的一些早期研究,Ken Thompson是 Unix的主要发明人,也就是大名鼎鼎的Unix之父。Unix之父将此符号系统引入编辑器QED,然后是Unix上的编辑器ed,并最终引入grep。Jeffrey Friedl 在其著作当中对此作了进一步阐述讲解。
然后,正则表达式在各种计算机语言或各种应用领域得到了广大的应用和发展,并且不断演变成如今更加方便使用的形式。
正则表达式引擎
正则表达式的引擎主要分为两大类:一种是DFA,一种是NFA,后来又出现了两者的合并类
POSIX NFA。DFA引擎在线性时状态下执行,可以确保匹配最长的可能的字符串。但是,因为 DFA 引擎只包含有限的状态,所以它不能匹配具有反向引用的模式;并且因为它不构造显示扩展,所以它不可以捕获子表达式。NFA引擎以 特定扩展以获得成功的匹配,所以它可以捕获子表达式匹配和匹配的反向引用,但是执行速度可能因此被拖慢。
POSIX NFA 引擎与传统的 NFA 引擎类似,不同点在于除非已经找到了可能的最长的匹配,否则它将一直回溯。因此,POSIX NFA 引擎的速度慢于传统的 NFA 引擎。
NFA以表达式为主导,DFA以文本为主导。一般而论,DFA引擎则搜索更快一些,但是NFA以表达式为主导,反而更容易操纵,因此一般程序员更偏爱NFA引擎。两种引擎各有所长,在实战的时候请根据自己的需要选择适合的正则表达式引擎。