REGEX(3) Linux程序員手冊 REGEX(3)
名稱
regcomp、regexec、 regerror、 regfree - POSIX regex函數
摘要
#include
#include
int regcomp(regex_t *preg, const char *regex, int cflags);
int regexec(const regex_t *preg, const char *string, size_t nmatch, regmatch_t pmatch[], int eflags);
size_t regerror(int errcode, const regex_t *preg, char *errbuf, size_t errbuf_size);
void regfree(regex_t *preg);
說明
POSIX Regex編譯
regcomp()用于把正則表達式編譯成適于隨後regexec()所要搜索的形式。
regcomp()的參數有:preg,一個指向存儲表達式的緩衝區的指針;regex,一個指向以null終止的字符串的指針;cflags,用于確定編譯類型的標志。
所有正則表達式的搜索必須通過已編譯的表達式緩衝區。因此,regexec()總應得到已由regcomp()初始化的表達式緩衝區地址。
cflags可以是以下一個或多個標志的按位或:
REG_EXTENDED
以POSIX擴展正則表達式語法來解析regex。若不設置,則使用POSIX基本正則表達式語法。
REG_ICASE
不區分大小寫。隨後使用此表達式的regexec()將會忽略大小寫。
REG_NOSUB
不必支持匹配子串的尋址。若所提供的表達式緩衝區以此標志來編譯,則忽略傳遞給regexec()的nmatch和pmatch參數。
REG_NEWLINE
匹配任意字符的操作符不匹配新行。
不含換行符的非匹配列表([^...])不匹配換行符。
不管regexec()的執行標志eflags是否包含REG_NOTBOL,匹配行首的操作符(^)也匹配緊接在換行符之後的空字符串。
不管eflags是否包含REG_NOTEOL,匹配行尾的操作符($)也匹配後邊緊接著換行符的空字符串。
POSIX Regex匹配
regexec()用于匹配相應于預編譯表達式緩衝區preg的以null終止的字符串。nmatch和pmatch用于提供匹配位置方面的信息。eflags可以是以下所述的引致匹配行為改變的REG_NOTBOL和REG_NOTEL中的一個或兩個的按位或。
REG_NOTBOL
匹配行首的操作符總是不能匹配行首(但請參閱以上編譯標志REG_NEWLINE的說明)。此標志可用于一個字符串的不同部分傳遞給regexec(),並且字符串首不應被解析為首行的情況。
REG_NOTEOL
匹配行尾的操作符總是不能匹配行尾(但請參閱以上編譯標志REG_NEWLINE的說明)。
字節偏移量
除非為編譯表達式緩衝區設置了REG_NOSUB,否則可以獲得匹配子串的尋址信息。pmatch必須至少有nmatch個元素的大小。任何未使用的結構體成員的值將會設為-1。
作為pmatch的類型,regmatch_t結構體定義于。
typedef struct {
regoff_t rm_so;
regoff_t rm_eo;
} regmatch_t;
每個其值不是-1的rm_so元素指出字符串內的下一最大匹配子串的起始偏移量。相應地,rm_eo元素指出匹配子串中以第一個字符為參照的終止偏移量。
Posix錯誤報告
regerror()用于把由regcomp()和regexec()返回的錯誤碼轉換成錯誤信息字符串。
regerror()接受以下參數:errcode,錯誤碼;preg,表達式緩衝區;errbuf,一個指向字符串緩衝區的指針;errbuf_size,字符串緩衝區的大小。它返回errbuf用于容納以null終止的錯誤信息字符串的大小。若errbuf與errbuf_size皆非零,errbuf將填以由大小為errbuf_size-1個字符的錯誤信息及null終止符組成的字符串的首址。
釋放POSIX表達式緩衝區
傳regfree()以預編譯表達式緩衝區preg,將釋放由編譯函數regcomp()分配的表達式緩衝區。
返回值
若成功編譯,則regcomp()返回0;否則,返回錯誤碼。
若成功匹配,則regexec()返回0;否則,返回REG_NOMATCH。
錯誤碼
以下錯誤碼能由regcomp()返回:
REG_BADBR
非法使用後退標記操作符。
REG_BADPAT
非法使用諸如組或列表的表達式操作符。
REG_BADRPT
非法使用重復操作符。譬如:以“*”為第一個字符。
REG_EBRACE
不匹配的花括號間隔操作符。
REG_EBRACK
不匹配的方括號列表操作符。
REG_ECOLLATE
非法比較元素。
REG_ECTYPE
未知字符類型名。
REG_EEND
未明確的錯誤。POSIX.2尚未定義。
REG_EESCAPE
尾部出現反斜線符號。
REG_EPAREN
不匹配的圓括號組操作符。
REG_ERANGE
非法使用範圍操作符。譬如:範圍的終點比起點早出現。
REG_ESIZE
編譯過的正則表達式請求大于64Kb的表達式緩衝區。POSIX.2沒定義這種行為。
REG_ESPACE
regex例程耗盡內存。
REG_ESUBREG
子表達式的非法後退標記。
遵從
POSIX.1-2001
另見
grep(1)、regex(7)、GNU regex手冊
版權頁標志
此頁是Linux man-pages項目3.19版的一部分。可以從http://www.kernel.org/doc/man-pages/找到有關此項目的描述及缺陷報告信息。
GNU 2008-05-29 REGEX(3)
版權 © 2024 石仔