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