如果用户熟悉 Linux 下的 sed、awk、grep 或 vi,那么对正则表达式这一概念肯定不会
陌生。由于它可以极大地简化处理字符串时的复杂度,因此现在已经在许多 Linux 实用
工具中得到了应用。千万不要以为正则表达式只是 Perl、Python、Bash 等脚本语言的
专利,作为 C 语言程序员,用户同样可以在自己的程序中运用正则表达式。
标准的 C 和 C++都不支持正则表达式,但有一些函数库可以辅助 C/C++程序员完成这
一功能,其中最著名的当数 Philip Hazel 的 Perl-Compatible Regular Expression 库,
许多 Linux 发行版本都带有这个函数库。
编译正则表达式
为了提高效率,在将一个字符串与正则表达式进行比较之前,首先要用 regcomp()函数
对它进行编译,将其转化为 regex_t 结构:
int regcomp(regex_t *preg, const char *regex,
int cflags);
参数 regex 是一个字符串,它代表将要被编译的正则表达式;参数 preg 指向一个声明
为 regex_t 的数据结构,用来保存编译结果;参数 cflags 决定了正则表达式该如何被处
理的细节。
如果函数 regcomp()执行成功,并且编译结果被正确填充到 preg 中后,函数将返回
0
,任何其它的返回结果都代表有某种错误产生。
匹配正则表达式
一旦用 regcomp()函数成功地编译了正则表达式,接下来就可以调用 regexec()函数完
成模式匹配:
int regexec(const regex_t *preg,
const char *string, size_t nmatch,
regmatch_t pmatch[], int eflags);
typedef struct {
regoff_t rm_so;
regoff_t rm_eo;
} regmatch_t;
参数 preg 指向编译后的正则表达式,参数 string 是将要进行匹配的字符串,而参数
nmatch 和 pmatch 则用于把匹配结果返回给调用程序,最后一个参数 eflags 决定了匹
配的细节。
在调用函数 regexec()进行模式匹配的过程中,可能在字符串 string 中会有多处与给定
的正则表达式相匹配,参数 pmatch 就是用来保存这些匹配位置的,而参数 nmatch 则
告诉函数 regexec()最多可以把多少个匹配结果填充到 pmatch 数组中。当 regexec()
函数成功返回时,从 string+pmatch[0].rm_so 到 string+pmatch[0].rm_eo 是第一
个匹配的字符串,而从 string+pmatch[1].rm_so 到 string+pmatch[1].rm_eo,则是
第二个匹配的字符串,依此类推。