首先說明,標准C/C++都不支持正則表達式,但有些函數庫提供了這個功能,Philip Hazel的Perl-Compatible Regular Expression庫,並且大多數Linux發行版本都帶有這個函數庫。
使用正則表達式可簡單的分成幾步:
1.編譯正則表達式
2.執行匹配
3.釋放內存
首先,編譯正則表達式
int regcomp(regex_t *preg, const char *regex, int cflags);
reqcomp()函數用於把正則表達式編譯成某種格式,可以使後面的匹配更有效。
preg: regex_t結構體用於存放編譯後的正則表達式;
regex: 指向正則表達式指針;
cflags:編譯模式
共有如下四種編譯模式:
REG_EXTENDED:使用功能更強大的擴展正則表達式
REG_ICASE:忽略大小寫
REG_NOSUB:不用存儲匹配後的結果
REG_NEWLINE:識別換行符,這樣‘$’就可以從行尾開始匹配,‘^’就可以從行的開頭開始匹配。否則忽略換行符,把整個文本串當做一個字符串處理。
其次,執行匹配
int regexec(const regex_t *preg, const char *string, size_t nmatch, regmatch_t pmatch[], int eflags);
preg: 已編譯的正則表達式指針;
string:目標字符串;
nmatch:pmatch數組的長度;
pmatch:結構體數組,存放匹配文本串的位置信息;
eflags:匹配模式
共兩種匹配模式:
REG_NOTBOL:The match-beginning-of-line operator always fails to match (but see the compilation flag REG_NEWLINE above). This flag may be used when different portions of a string are passed to regexec and the beginning of the string should not be interpreted as the beginning of the line.
REG_NOTEOL:The match-end-of-line operator always fails to match (but see the compilation flag REG_NEWLINE above)
最後,釋放內存
void regfree(regex_t *preg);
當使用完編譯好的正則表達式後,或者需要重新編譯其他正則表達式時,一定要使用這個函數清空該變量。
其他,處理錯誤
size_t regerror(int errcode, const regex_t *preg, char *errbuf, size_t errbuf_size);
當執行regcomp 或者regexec 產生錯誤的時候,就可以調用這個函數而返回一個包含錯誤信息的字符串。
errcode: 由regcomp 和 regexec 函數返回的錯誤代號。
preg: 已經用regcomp函數編譯好的正則表達式,這個值可以為NULL。
errbuf: 指向用來存放錯誤信息的字符串的內存空間。
errbuf_size: 指明buffer的長度,如果這個錯誤信息的長度大於這個值,則regerror 函數會自動截斷超出的字符串,但他仍然會返回完整的字符串的長度。所以我們可以用如下的方法先得到錯誤字符串的長度。
示例
01
#include <stdio.h>
02
#include <stdlib.h>
03
#include <sys/types.h>
04
#include <regex.h>
05
06
int validate_pattern__r(const char *pattern, const char *in_str);
07
08
int main(int argc, char **argv)
09
{
10
int result = -1;
11
char patt[] = "^([2-9][0-9]{3}|[1-9][0-9]{4,6}|10000000)$";
12
char str[] = "10000000";
13
14
result = validate_pattern__r(patt, str);
15
if(0 == result)
16
{
17
printf("OK, match!\n");
18
}
19
else
20
{
21
printf("NOK, not match!\n");
22
}
23
24
return 0;
25
}
26
27
int validate_pattern__r(const char *pattern, const char *in_str)
28
{
29
int l_status = 0;
30
regex_t l_re;
31
32
printf("pattern: %s\n", pattern);
33
printf("in_str: %s\n", in_str);
34
35
regcomp(&l_re, pattern, REG_EXTENDED);
36
l_status = regexec(&l_re, in_str, (size_t)0, NULL, 0);
37
regfree(&l_re);
38
if(0 != l_status)
39
{
40
return -1;
41
}
42
43
return 0;
44
}