正規表示式定義
正規表示式
(regular expression)
是linux
系統中一種非常重要的字串搜尋模式,是一組規則字元的集合。這些規則字元能夠組成我們所需要的搜尋規則,效率高、功
能強,可以極大地簡化處理字串時的複雜度。在很多
linux
工具(sed
、grep
、find等)
和指令碼語言
(awk
、perl等)
中都有著重要的地
位。當我們在編寫字串相關的應用程式時,掌握正規表示式會起到事半功倍的效果。 c
中的正規表示式標準c
和c++
都不支援正規表示式,但是千萬不要以為正規表示式就只是
perl
、python
、bash
等指令碼語言的專利,作為
c語言程式設計師,使用者同樣可
以在自己的程式中運用正規表示式,只是需要一些函式庫輔助
c/c++
程式設計師來完成這一功能。許多
linux
發行版本都帶有
posix
函式庫,下面我將以
posix
函式庫中的
regex
系列函式來說明在
linux c
下如何使用正規表示式。
首先要用
regcomp()
函式對它進行編譯,將其轉化為
regex_t
結構。因為乙個正規表示式需要編譯成乙個特定的資料結構才能被後續的函式使用。
regcomp()
函式的原型是:
int regcomp(regex_t *preg, const char *regex, int cflags)
引數preg
指向乙個宣告為
regex_t
的資料結構,用來儲存編譯結果。引數
regex
為要編譯的正規表示式字串。引數
cflags
是編譯開關,編譯
開關可以控制規則生成的特性,如
reg_extend
代表使用擴充套件正規表示式模式;
reg_icase
表示對規則中字串不區分大小
寫;reg_nosub
只檢查是否有符合規則的子串。
下面匹配正規表示式,一旦用
regcomp()
函式成功地編譯了正規表示式,接下來就可呼叫
regexec()
函式完成模式匹配。
regexec()
函式的原型:
int regexec(const regex_t *preg, const char *string, size_t nmatch,regmatch_t pmatch, int eflags)
函式用於在字串(引數
string)
中匹配正規表示式(引數
preg)
。而引數
nmatch
和pmatch
則用於把匹配結果返回給呼叫程式。在呼叫函式
egexec()
進行模式匹配的過程中,可能在字串
string
中會有多處與給定的正規表示式相匹配。引數
pmatch
用來儲存這些匹配位置。引數
nmatch
則告訴函式
regexec()
最多可以把多少個匹配結果填充到
pmatch
陣列中。
typedef struct regmatch_t;
其中rm_so
表示滿足規則的子串在
string
中的起始偏移量,
rm_eo
表示滿足規則的子串在
string
中的後續偏移量。當
regexec
成功返回
時,從pmatch[0].rm_so
到pmatch[0].rm_eo
是第乙個匹配的字串。最後乙個引數
eflags
決定了匹配的特性,當需要匹配的
string
非常大的時候可以通過
eflags
來表示是否是第一行
(reg_notbol)
,或最後一行
(reg_noteol)
。還有乙個函式是用來獲取錯誤資訊的,
size_t regerror(int errcode, const regex_t *preg, char *errbuf, size_t errbuf_size)
。引數errcode
是來自函式
regcomp()
或regexec()
的錯誤**,而引數
preg
則是由函式
regcomp()
得到的編譯結果,其目的是把格式化訊息所必須的上下文提供給
regerror()
函式。在執行函式
regerror()
時,將按照引數
errbuf_size
指明的最大位元組數。在
errbuf
緩衝區中填入格式化後的錯誤資訊,同時返回錯誤資訊的長度。
最後釋放正規表示式。無論什麼時候,當不再需要已經編譯過的正規表示式時,都應該呼叫函式
regfree()
將其釋放,以免產生記憶體洩漏。
void regfree(regex_t *preg);
函式regfree()
不會返回任何結果,它僅接收乙個指向
regex_t
資料型別的指標,這是之前呼叫
regcomp()
函式所得到的編譯結果。
正規表示式示例表字元
意義示例
* 任意長度的字串。
a* 表示
: 空字串、
aaaa、a…
? 長度為0或者
1的字串。
a? 表示
: 空字串和a。
+ 長度為乙個或者多個的字串。
a+表示:a、
aa、aaaaaa…
. 任意字元。
a. 表示
:a後跟任意字元。
{} 代表上一規則重複數目、
包含一組匹配花括號,裡面有兩個數字和乙個字元,表示在指定次數範圍內找到字元。a表示
:三個a、
a表示:乙個到三個a、
a 表示
:大於等於三個a、
表示在3到7
次重複範圍內匹配字元a。
集合,代表方括號中任意乙個字元。
[ab]
表示:a或者b
都可以、
[a-z] 表示:
從a到z
的字元。
() 組
,代表一組字元。
(ab)
表示:abab
。a/b
同時滿足。
a/b表示
:字串
a後跟字串
b才能滿足要求。
a|b 並列,
代表符合
a或者符合
b都可以
a|b表示
: 字串
a或者字串
b都滿足要求。
^ 如果放在開頭表示代表該規則必須在字串的開頭,其他位置代表字元本身。
如果放在
中的開頭表示對該集合取反
,其他位置代表字元本身。
^a表示
:a必須在字串的開頭、
[^a]表示:
除了a以外的其他字元。
$ 如果放在最後表示該規則必須放在最後
,其他位置代表字元本身。
a$表示
:a必須在字串最後。
/:s
正規表示式用
/:s
表示空格。
a/:sb
匹配a b
。/:a
正規表示式用
/:a
表示字元與數字。
a/:a
匹配ab
、a6
等。/:c
正規表示式用
/:c
僅表示字元。
a/:c
匹配ac
等,不匹配
a1等。
/:p
正規表示式用
/:p
表示可列印字元。
/:d
正規表示式用
/:d
僅表示數字。
a/:c
匹配a1
等,不匹配
ac等。
/:x00
正規表示式用
/:x00
表示ascii
字元。/:r
正規表示式用
/:r
表示回車。
/:n
正規表示式用
/:d
表示換行。
具體請:man regex
linux c 正規表示式
最近有這麼個需求,c搞搞正則,畢竟regular expression so強大 標準的c和c 都不支援正規表示式,但有一些函式庫可以輔助c c 程式設計師完成這一功能,其中最著名的當數philip hazel的perl compatible regular expression庫,許多linux發...
linux C正規表示式
在網上找到的乙個程式 c include include include 取子串的函式 static char substr const char str,unsigned start,unsigned end unsigned n end start static char stbuf 256 s...
linux c 正規表示式
標準的c和c 都不支援正規表示式,但有一些函式庫可以輔助c c 程式設計師完成這一功能,其中最著名的當數philip hazel的perl compatible regular expression庫,許多linux發行版本都帶有這個函式庫。編譯正規表示式 為了提高效率,在將乙個字串與正規表示式進行...