原文地址
正則表達(dá)式在Unix/Liunx系統(tǒng)中起著非常重要的作用,在很大一部分的程序中都使用了正則表達(dá)式,可以這么說(shuō):“在Unix/Linux系統(tǒng)中,如果不懂正則表達(dá)式就不算會(huì)使用該系統(tǒng)”。本文中使用的Lex和Yacc都是基于正則表達(dá)式的應(yīng)用,因此有必要用一篇文檔的形式詳細(xì)說(shuō)明在Lex和Yacc中使用的正則表達(dá)式為何物!
其實(shí)正則表達(dá)式非常簡(jiǎn)單,用過(guò)DOS的人都知道通配符吧,說(shuō)得簡(jiǎn)單一點(diǎn),正則表達(dá)式就是稍微復(fù)雜一點(diǎn)的通配符。這里的正則表達(dá)式非常簡(jiǎn)單,規(guī)則非常少,只需要花上幾分鐘就可以記住。正則表達(dá)式的元字符列表如下:
元字符 | 匹配內(nèi)容 |
. | 除了換行符之外的任意字符 |
\n | 換行符 |
* | 0次或者多次匹配 |
+ | 1次或者多次匹配 |
? | 0次或者1次匹配 |
^ | 行首 |
$ | 行尾 |
a|b | a或者b |
(ab)+ | ab的一次或者多次匹配 |
“a+b” | a+b(字面意思) |
[] | 一類(lèi)字符 |
有了上面的元字符之后,就可以用上面的元字符表達(dá)出非常復(fù)雜的匹配內(nèi)容出來(lái),就像DOS名令中的通配符可以匹配多個(gè)指定規(guī)則的文件名一樣。現(xiàn)在讓我們看看上面的元字符的一些應(yīng)用例子,列表如下:
表達(dá)式 | 匹配內(nèi)容 |
abc | abc |
abc* | abc abcc abccc abcccc …… |
abc+ | abcc abccc abcccc …… |
a(bc)+ | abcbc abcbcbc abcbcbcbc …… |
a(bc)? | abc abcbc |
[abc] | a b c其中之一 |
[a-z] | a b c d e f g… … z其中之一 |
[a\-z] | a – z 三個(gè)字符其中之一 |
[-az] | – a z 三個(gè)字符其中之一 |
[A-Za-z0-9]+ | 大小寫(xiě)字符和10個(gè)數(shù)字的一個(gè)或多個(gè) |
[ \t\n] | 空格,跳格,換行三者之一(空白符) |
[^ab] | 除了ab之外的任意字符 |
[a^b] | a ^ b 三者之一 |
[a|b] | a | b 三者之一 |
a|b | a b 兩者之一 |
^abc$ | 只有abc的一行 |
注意*和+的區(qū)別,通配符只是匹配之前最近的元素,可以用小括號(hào)將多個(gè)元素括起來(lái),整個(gè)括號(hào)括起來(lái)的整體可以看作是一個(gè)元素。那么通配符就可以匹配整個(gè)括號(hào)的內(nèi)容了。
方括號(hào)表示的是一類(lèi)字符,[abc]就是定義了只有abc三個(gè)字符的一類(lèi)字符。這一點(diǎn)和abc不同,如果跟上通配符(*+?)的話(huà),那么方括號(hào)就可以表示前面的任意的字符之一的一個(gè)字符的多個(gè)匹配,但是abc的話(huà)就只能是c的多個(gè)匹配了。說(shuō)的更明白點(diǎn)就是DOS里面的通配符*表示的是任意字符的零個(gè)或者多個(gè),而這里的方括號(hào)就是把DOS里面的任意字符類(lèi)縮小為只有方括號(hào)表示的類(lèi)了。另外還要注意連字符-在方括號(hào)中的意思,在方括號(hào)的中間表示“范圍”的意思,而在首部則僅僅表示自己而已。
轉(zhuǎn)義用\,這和C語(yǔ)言類(lèi)似,另外還需要注意三個(gè)特殊的元字符(^ | $)的意義。‘^’放在方括號(hào)的首部表示“除了”的意思,在其他地方?jīng)]有特別意義。‘|’不在方括號(hào)中表示“或者”,‘$’通常表示行尾。
通過(guò)上面的注釋可以看出:使用正則表達(dá)式可以表示非常復(fù)雜的匹配內(nèi)容。