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