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