浅谈正则表达式背后的基本原理

1、写在前面

搞编程的都知道正则表达式是什么东西,这里就很少啰嗦了,须要强调的是,这篇文章并非教你怎么去使用用正则表达式,正则表达式的语法并非本文的重点,这篇文章的目的就是剥开正则表达式的语法糖,来看一看正则表达式最本质的原理,若是文章中有错误或者纰漏,欢迎批评指正。程序员

2、什么是语法糖

在上面我提到了语法糖的概念,也许有人还不清楚语法糖是什么东西,这里简单的说一下。正则表达式

语法糖(Syntactic sugar),也译为糖衣语法,是由英国计算机科学家彼得·约翰·兰达(Peter J. Landin)发明的一个术语,指计算机语言中添加的某种语法,这种语法对语言的功能并无影响,可是更方便程序员使用。一般来讲使用语法糖可以增长程序的可读性,从而减小程序代码出错的机会。——摘自 百度百科编程

能够这么说吧,像C、C++、Java等等这些编程语言均可以看作成语法糖,由于最终仍是得将这些高级程序语言翻译成机器代码,也就是10101……这样的形式,要知道全部的可执行程序最终均可以只须要赋值跳转两种结构便可,而高级语言都是对这两种结构的封装,来适应不一样的应用场景,除了机器代码,汇编和这些高级语言都是语法糖,一层一层的包装,达到简化开发的目的,你们想一想,若是没有这些语法糖,那咱们岂不是得每天用机器代码写程序?闭包

3、算数表达式

这里先引入一个小小的例子,我想在阅读这篇文章的人都知道什么是算数表达式,最基本的算数表达式:编程语言

1,2,3,4,5,6,7,8,9,0,……
+,-,*,/,……

这些都是最基本的算数表达式,而由这些最基本的算数表达式能够构造出更加复杂的复合表达式好比1+1,3*5等等,不管是基本的仍是复合的,它们都是算数表达式,经过这个例子,来天然的过渡到下面正则表达式的内容,其实本质上算数表达式和正则表达式的道理是差很少的。学习

4、正则表达式

构成正则表达式最基本的就是给定的字符集∑={c1,c2,c3,……,cn},这就至关于算数表达式中的0,1,2,3……这些基本算数表达式。
接下来呢,就是他的概括定义,来告诉咱们如何经过最基本的字符集构造出复杂的正则表达式:翻译

  1. 空串ε是正则表达式。
  2. 对于任意字符c∈∑,c是正则表达式
  3. 若是M,N是正则表达式,则如下也是正则表达式:code

    **选择**  M|N = {M,N}
    **链接**  MN  = {mn | m∈M, n∈N}
    **闭包**  M*  = {ε,M,MM,MMM,……}

不难看出,以上的概括定义给出了正则表达式最基本的的形式,不管多么复杂的正则表达式都是在这个基础上构成的。htm

如今咱们经过一个小例子来加深对上面概念的理解:开发

给定一个字符集∑={a,b},能够写出那些正则表达式呢?
1.  ε
2.  a,b
3.  ε|ε,ε| a , ε| b ,……
4.  εa , εb , ab , εε , ……
5.  a(ε| a) , b(ε|b),……
6.  ε* , (a(ε| a))*,……
7.  ……

也就是说,单个的字符都是正则表达式,它们按照上面的定义组合起来依然是正则表达式,正则表达式与正则表达式相互组合又能够生成新的正则表达式,在复杂的正则表达式都是由这些基本的正则表达式构成,固然了上面这些只是该字符集的正则表达式的一小部分,由于这个字符集的正则表达式集合是一个无限集,到这里,我想你们应该有所体会。

咱们再来看一个例子:

咱们用上面的正则表达式的概念来构造出用来描述C语言标识符的正则表达式:
首先给定字符集,咱们都知道C语言的字符集有ASCII码构成。
C语言标识符的格式:以字母或下划线开头,后面跟零个或多个字母、数字或下划线。

该怎么用正则表达式来描述呢?

(a|b|c|……|z|A|B|C|……|Z|_)(a|b|c|……|z|A|B|C|……|Z|0|1|2|3|……|9|_))*

首先来看,这个正则表达式是由两个子表达式链接而成,每一个子表达式都是用选择符|构成,又由于第二个子表达式能够出现零或屡次,因此加上闭包,是否是看的脑壳都大了,是否是以为平时何时这么写过正则表达式,下面就得说说语法糖的做用啦。

5、正则表达式中的语法糖

你们接触到的正则表达式的语法彷佛是有差别的,好比POSIX风格正则表达式和Perl风格正则表达式,要知道不管什么风格的正则表达式它们背后的原理都是同样的,只是在上层提供的语法糖不同而已,实际应用的过程当中都是根据上面的原理演变过来的,语法糖能够大大简化正则表达式的形式,变得更容易阅读和理解,就像下面的对应关系同样。

[c1-cn] == c1|c2|c3|……|cn

e? == ε|e

e+ == (e*)\ε

e{i,j} == i到j个e链接

这里就不一一举例了,不管上面的对应关系中左边的语法如何变化,它所对应的右边的基本原理都是同样的。

6、小结

正则表达式能够写的很是复杂,复杂到除了做者外不多有人看的懂的,曾经我也是一度不能自拔,但随着学习的深刻,慢慢的发现,剥开正则表达式表面的东西,去看背后的原理,才有一种恍然大悟的感受。

相关文章
相关标签/搜索