日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

正则表达式发明者_浅谈正则表达式背后的基本原理

發(fā)布時(shí)間:2025/3/12 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 正则表达式发明者_浅谈正则表达式背后的基本原理 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一、寫在前面

搞編程的都知道正則表達(dá)式是什么東西,這里就不多啰嗦了,需要強(qiáng)調(diào)的是,這篇文章并不是教你怎么去使用用正則表達(dá)式,正則表達(dá)式的語(yǔ)法并不是本文的重點(diǎn),這篇文章的目的就是剝開正則表達(dá)式的語(yǔ)法糖,來看一看正則表達(dá)式最本質(zhì)的原理,如果文章中有錯(cuò)誤或者紕漏,歡迎批評(píng)指正。

二、什么是語(yǔ)法糖

在上面我提到了語(yǔ)法糖的概念,也許有人還不清楚語(yǔ)法糖是什么東西,這里簡(jiǎn)單的說一下。

語(yǔ)法糖(Syntactic sugar),也譯為糖衣語(yǔ)法,是由英國(guó)計(jì)算機(jī)科學(xué)家彼得·約翰·蘭達(dá)(Peter J. Landin)發(fā)明的一個(gè)術(shù)語(yǔ),指計(jì)算機(jī)語(yǔ)言中添加的某種語(yǔ)法,這種語(yǔ)法對(duì)語(yǔ)言的功能并沒有影響,但是更方便程序員使用。通常來說使用語(yǔ)法糖能夠增加程序的可讀性,從而減少程序代碼出錯(cuò)的機(jī)會(huì)。——摘自 百度百科

可以這么說吧,像C、C++、Java等等這些編程語(yǔ)言都可以看做成語(yǔ)法糖,因?yàn)樽罱K還是得將這些高級(jí)程序語(yǔ)言翻譯成機(jī)器代碼,也就是10101……這樣的形式,要知道所有的可執(zhí)行程序最終都可以只需要賦值和跳轉(zhuǎn)兩種結(jié)構(gòu)即可,而高級(jí)語(yǔ)言都是對(duì)這兩種結(jié)構(gòu)的封裝,來適應(yīng)不同的應(yīng)用場(chǎng)景,除了機(jī)器代碼,匯編和這些高級(jí)語(yǔ)言都是語(yǔ)法糖,一層一層的包裝,達(dá)到簡(jiǎn)化開發(fā)的目的,大家想想,如果沒有這些語(yǔ)法糖,那我們豈不是得天天用機(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語(yǔ)言標(biāo)識(shí)符的正則表達(dá)式:

首先給定字符集,我們都知道C語(yǔ)言的字符集有ASCII碼構(gòu)成。

C語(yǔ)言標(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á)式,下面就得說說語(yǔ)法糖的作用啦。

五、正則表達(dá)式中的語(yǔ)法糖

大家接觸到的正則表達(dá)式的語(yǔ)法似乎是有差異的,比如POSIX風(fēng)格正則表達(dá)式和Perl風(fēng)格正則表達(dá)式,要知道無論什么風(fēng)格的正則表達(dá)式它們背后的原理都是一樣的,只是在上層提供的語(yǔ)法糖不一樣而已,實(shí)際應(yīng)用的過程中都是根據(jù)上面的原理演變過來的,語(yǔ)法糖可以大大簡(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)系中左邊的語(yǔ)法如何變化,它所對(duì)應(yīng)的右邊的基本原理都是一樣的。

六、小結(jié)

正則表達(dá)式可以寫的非常復(fù)雜,復(fù)雜到除了作者外很少有人看的懂的,曾經(jīng)我也是一度不能自拔,但隨著學(xué)習(xí)的深入,慢慢的發(fā)現(xiàn),剝開正則表達(dá)式表面的東西,去看背后的原理,才有一種恍然大悟的感覺。

總結(jié)

以上是生活随笔為你收集整理的正则表达式发明者_浅谈正则表达式背后的基本原理的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。