正则表达式发明者_浅谈正则表达式背后的基本原理
一、寫在前面
搞編程的都知道正則表達式是什么東西,這里就不多啰嗦了,需要強調的是,這篇文章并不是教你怎么去使用用正則表達式,正則表達式的語法并不是本文的重點,這篇文章的目的就是剝開正則表達式的語法糖,來看一看正則表達式最本質的原理,如果文章中有錯誤或者紕漏,歡迎批評指正。
二、什么是語法糖
在上面我提到了語法糖的概念,也許有人還不清楚語法糖是什么東西,這里簡單的說一下。
語法糖(Syntactic sugar),也譯為糖衣語法,是由英國計算機科學家彼得·約翰·蘭達(Peter J. Landin)發明的一個術語,指計算機語言中添加的某種語法,這種語法對語言的功能并沒有影響,但是更方便程序員使用。通常來說使用語法糖能夠增加程序的可讀性,從而減少程序代碼出錯的機會?!?百度百科
可以這么說吧,像C、C++、Java等等這些編程語言都可以看做成語法糖,因為最終還是得將這些高級程序語言翻譯成機器代碼,也就是10101……這樣的形式,要知道所有的可執行程序最終都可以只需要賦值和跳轉兩種結構即可,而高級語言都是對這兩種結構的封裝,來適應不同的應用場景,除了機器代碼,匯編和這些高級語言都是語法糖,一層一層的包裝,達到簡化開發的目的,大家想想,如果沒有這些語法糖,那我們豈不是得天天用機器代碼寫程序?
三、算數表達式
這里先引入一個小小的例子,我想在閱讀這篇文章的人都知道什么是算數表達式,最基本的算數表達式:
1,2,3,4,5,6,7,8,9,0,……
+,-,*,/,……
這些都是最基本的算數表達式,而由這些最基本的算數表達式可以構造出更加復雜的復合表達式比如1+1,3*5等等,無論是基本的還是復合的,它們都是算數表達式,通過這個例子,來自然的過渡到下面正則表達式的內容,其實本質上算數表達式和正則表達式的道理是差不多的。
四、正則表達式
構成正則表達式最基本的就是給定的字符集∑={c1,c2,c3,……,cn},這就相當于算數表達式中的0,1,2,3……這些基本算數表達式。
接下來呢,就是他的歸納定義,來告訴我們如何通過最基本的字符集構造出復雜的正則表達式:
空串ε是正則表達式。
對于任意字符c∈∑,c是正則表達式
如果M,N是正則表達式,則以下也是正則表達式:
**選擇** M|N = {M,N}
**連接** MN = {mn | m∈M, n∈N}
**閉包** M* = {ε,M,MM,MMM,……}
不難看出,以上的歸納定義給出了正則表達式最基本的的形式,無論多么復雜的正則表達式都是在這個基礎上構成的。
現在我們通過一個小例子來加深對上面概念的理解:
給定一個字符集∑={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|_))*
首先來看,這個正則表達式是由兩個子表達式連接而成,每個子表達式都是用選擇符|構成,又因為第二個子表達式可以出現零或多次,所以加上閉包,是不是看的腦袋都大了,是不是覺得平時什么時候這么寫過正則表達式,下面就得說說語法糖的作用啦。
五、正則表達式中的語法糖
大家接觸到的正則表達式的語法似乎是有差異的,比如POSIX風格正則表達式和Perl風格正則表達式,要知道無論什么風格的正則表達式它們背后的原理都是一樣的,只是在上層提供的語法糖不一樣而已,實際應用的過程中都是根據上面的原理演變過來的,語法糖可以大大簡化正則表達式的形式,變得更容易閱讀和理解,就像下面的對應關系一樣。
[c1-cn] == c1|c2|c3|……|cn
e? == ε|e
e+ == (e*)\ε
e{i,j} == i到j個e連接
這里就不一一舉例了,無論上面的對應關系中左邊的語法如何變化,它所對應的右邊的基本原理都是一樣的。
六、小結
正則表達式可以寫的非常復雜,復雜到除了作者外很少有人看的懂的,曾經我也是一度不能自拔,但隨著學習的深入,慢慢的發現,剝開正則表達式表面的東西,去看背后的原理,才有一種恍然大悟的感覺。
總結
以上是生活随笔為你收集整理的正则表达式发明者_浅谈正则表达式背后的基本原理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: html定义一个集合,HTML标签属性集
- 下一篇: 计算机软件技术 上海电力学院,上海电力学