background image

如果用户熟悉 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,则是

 

第二个匹配的字符串,依此类推。