全面分析Linux正則表達(dá)式(一)
正則表達(dá)式現(xiàn)在應(yīng)用十分的廣泛,出現(xiàn)在UNIX/Linux相關(guān)的各種領(lǐng)域和多種編程語(yǔ)言里。Linux系統(tǒng)管理員應(yīng)該熟悉這些表達(dá)式。從常見(jiàn)的shell命令到大名鼎鼎的Perl語(yǔ)言再到當(dāng)前非常流行的PHP,它都扮演著一個(gè)重要的角色。甚至windows的命令行控制臺(tái)也支持正則表達(dá)式。
可以說(shuō),它是學(xué)好Linux/UNIX必需掌握的一個(gè)知識(shí)點(diǎn),否則你連Linux的啟動(dòng)腳本都讀不懂。偏偏它又的確有點(diǎn)晦澀難懂,而且相關(guān)的資料又大部分是英文,更為它的學(xué)習(xí)增加了幾多困難。即使有些中文的翻譯資料,不同的譯者對(duì)一些術(shù)語(yǔ)的譯法也五花八門(mén),讀著讓人平添困惑。為此,我決定為它寫(xiě)一個(gè)簡(jiǎn)明教程,盡量可以覆蓋正則表達(dá)式涉及到的各主要概念。
我并不想把本文寫(xiě)成一本詳細(xì)的正則表達(dá)式語(yǔ)法手冊(cè),事實(shí)上,這些手冊(cè)已經(jīng)存在了,不過(guò)讀起來(lái)比較難懂。我希望的是在完成本教程后,你可以比較輕松的讀懂各種工具的正則表達(dá)式語(yǔ)法手冊(cè)并可以迅速上手,不過(guò)要用好正則表達(dá)式,可不是一篇短短的教程可以解決的,那是無(wú)數(shù)實(shí)踐練習(xí)的結(jié)果。但是,本文的***一部分對(duì)于正則表達(dá)式的編寫(xiě)提出了一些原則性的建議,學(xué)習(xí)一下這些正則表達(dá)式應(yīng)用先驅(qū)者的經(jīng)驗(yàn)會(huì)讓我們?cè)诮窈蟮膶?shí)踐中少走一些彎路。
正則表達(dá)式是英文“regular expressions”的譯文,它的產(chǎn)生據(jù)說(shuō)可以追溯到“神經(jīng)網(wǎng)絡(luò)”等比較高深的理論。那么什么是正則表達(dá)式呢?
正則表達(dá)式是從左向右去匹配目標(biāo)字符串的一組模式。大多數(shù)字符在模式中表示它們自身并匹配目標(biāo)中相應(yīng)的字符。舉個(gè)最簡(jiǎn)單的例子,模式“The quick brown fox”匹配了目標(biāo)字符串中與其完全相同的一部分。
前面已經(jīng)提過(guò),正則表達(dá)式被許多植根于UNIX/Linux的工具采用,可是這些工具的正則表達(dá)式語(yǔ)法并不完全相同,它們中的一些對(duì)正則表達(dá)式語(yǔ)法的擴(kuò)展并不被其它工具識(shí)別,這也為正則表達(dá)式的使用增加了難度。因此,當(dāng)你在一個(gè)具體的環(huán)境中使用正則表達(dá)式時(shí),你還要先看一下目標(biāo)環(huán)境支持的語(yǔ)法范圍,以確保你的正則表達(dá)式被正確的解析。
在本文中列舉的例子里,我們用正斜線“/”做為模式的定界符(delimiter),一個(gè)模式用下面這種格式表示:
/[A-Z]+(abc|xyz)*/i
本文將較詳細(xì)的闡明下面這些正則表達(dá)式概念:模式修正符(modifier),元字符(Meta-characters),子模式(subpatterns)與逆向引用(Back references),重復(fù)(Repetition)和量詞(quantifiers),斷言(Assertions),注釋?zhuān)齽t表達(dá)式中的遞歸,***我介紹一款方便學(xué)習(xí)正則表達(dá)式的工具并介紹一些正則表達(dá)式編寫(xiě)的思路。
正則表達(dá)式的模式修正符(modifier)
正則表達(dá)式的模式修正符主要用來(lái)限定模式與目標(biāo)字符串的匹配方式,例如是否需要大小寫(xiě)敏感的匹配,是單行模式還是多行模式。修正符中的空格和換行被忽略,其它字符會(huì)導(dǎo)致錯(cuò)誤。下面列舉一些常見(jiàn)的模式修正符。注意,模式修正符是區(qū)分大小寫(xiě)的。
i:非大小寫(xiě)敏感模式,:如果設(shè)定此修正符,模式中的字符將同時(shí)匹配大小寫(xiě)字母。
m:多行模式,當(dāng)設(shè)定了此修正符,“行起始”和“行結(jié)束”除了匹配整個(gè)字符串開(kāi)頭和結(jié)束外,還分別匹配其中的換行符的之后和之前。
s:單行模式,如果設(shè)定了此修正符,模式中的圓點(diǎn)元字符(.)匹配所有的字符,包括換行符。沒(méi)有此設(shè)定的話,則不包括換行符。
對(duì)于多行模式和單行模式,一個(gè)容易讓初學(xué)者迷惑的地方是這兩者并不向字面上那樣是互斥的。事實(shí)上,它們只是分別定義了英文句點(diǎn)(.)、音調(diào)符(^)和美元符($)這三個(gè)元字符的匹配方式,因此,單行模式與多行模式的修正符可以同時(shí)使用。
x:如果設(shè)定了此修正符,模式中的空白字符除了被轉(zhuǎn)義的或在字符類(lèi)中的以外完全被忽略,在未轉(zhuǎn)義的字符類(lèi)之外的 # 以及下一個(gè)換行符之間的所有字符,包括兩頭,也都被忽略。它使得可以在復(fù)雜的模式中加入注釋。我們會(huì)在后面的部分更詳細(xì)的講解正則表達(dá)中的注釋。
模式修正符還有很多,這里不再一一列舉。我們會(huì)結(jié)合后面的內(nèi)容介紹一些其它的模式修正符。不同的工具也可以添加自己的模式修正符,不過(guò)上面幾最為常見(jiàn)。
模式修正符通常跟在模式定義結(jié)束符的后面,例如下面例子中模式***的“i”字符。/[A-Z]+(abc|xyz)*/i,這時(shí)此修正符會(huì)對(duì)整個(gè)匹配模式起作用。模式修正符也可以在模式內(nèi)部通過(guò)包含在 "(?" 和 ")" 之間的修正符字母序列來(lái)實(shí)現(xiàn)。例如,(?im) 設(shè)定了不區(qū)分大小寫(xiě),多行模式。也可以通過(guò)在字母前加上減號(hào)來(lái)取消這些選項(xiàng)。例如組合的選項(xiàng) (?im-s),設(shè)定了不區(qū)分大小寫(xiě)和多行模式,并取消了單行模式。如果一個(gè)字母在減號(hào)之前與之后都出現(xiàn)了,則該選項(xiàng)被取消設(shè)定。
注意,如果(?im-s)出現(xiàn)在一個(gè)子模式內(nèi)(被另一對(duì)小括號(hào)包含)會(huì)把模式修正符的作用局限在該子模式中。
【編輯推薦】