Lex和Yacc從入門到精通 2 正規表示式篇

2021-04-13 02:14:32 字數 1824 閱讀 9692

正規表示式在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名令中的萬用字元可以匹配多個指定規則的檔名一樣。現在讓我們看看上面的元字元的一些應用例子,列表如下:

表示式

匹配內容

abcabc

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語言類似,另外還需要注意三個特殊的元字元(^ | $)的意義。『^』放在方括號的首部表示「除了」的意思,在其他地方沒有特別意義。『|』不在方括號中表示「或者」,『$』通常表示行尾。

通過上面的注釋可以看出:使用正規表示式可以表示非常複雜的匹配內容,

Lex和Yacc從入門到精通 2 正規表示式篇

正規表示式在 unix liunx 系統中起著非常重要的作用,在很大一部分的程式中都使用了正規表示式,可以這麼說 在 unix linux 系統中,如果不懂正規表示式就不算會使用該系統 本文中使用的 lex和 yacc 都是基於正規表示式的應用,因此有必要用一篇文件的形式詳細說明在 lex和 yac...

Lex和Yacc從入門到精通 1 環境配置篇

abstract 在開發程式的過程中經常會遇到文字解析的問題,例如 解析c語言源程式,編寫 指令碼引擎等等,解決這種文字解析的方法有很多,一種方法就是自己手動用c或者 c 直接編寫解析程式,這對於簡單格式的文字資訊來說,不會是什麼問題,但是 對於稍微複雜一點的文字資訊的解析來說,手工編寫解析器將會是...

lex和yacc格式入門

lex和yacc格式入門 lex檔案 hi oi n tchau bye n int main void int yywrap void yacc檔案 token hi bye program hi bye hi hi bye bye int yyerror char msg 會發現它們的結構都很相...