regexec() 函数原型如下:
[C++] 纯文本查看 复制代码 #include <sys/types.h>
#include <regex.h>
int regexec(const regex_t *preg, const char *string, size_t nmatch, regmatch_t pmatch[], int eflags);
第一个参数是 regex_t 类型的指针,指向 pattern_buffer ,也就是先前通过 regcomp() 函数编译后的结果。第二个参数 string 指向了要进行匹配的字符串。第三个参数 nmatch 表示的是第四个参数 pmatch 数组的大小。pmatch 是一个结构数组,其结构为 regmatch_t 类型,定义如下:
[C++] 纯文本查看 复制代码
typedef struct {
regoff_t rm_so;
regoff_t rm_eo;
} regmatch_t;
这里,rm_so 表示匹配正则条件的起始位置;rm_eo 表示匹配正则条件的结束位置。如果 rm_so 的值为 -1 ,则表示这个结构并未让 regexec() 函数使用。换句话就是说,如果发生了匹配,就填充 pmatch 数组的相应项,一直递增,没有匹配到的自然留为 -1 。
第五个参数 eflags 是个标志,有两个可能值,可以用 OR (|)来组合:
REG_NOTBOL : 使特殊字符 ^ 无作用
REG_NOTEOL : 使特殊字符 $ 无作用
程序成功时返回 0,错误时返回错误代码,错误信息由 regerror() 函数来获取。
测试代码:
[C++] 纯文本查看 复制代码 #include <stdio.h>
#include <string.h>
#include <regex.h>
#define nmatch 8
int main(int argc, char *argv[])
{
regex_t preg;
char *regex_rule = "[0-9]{3}abc";
regmatch_t pmatch[nmatch];
unsigned int i, len;
/* 初始化 pattern buffer */
bzero(&preg, sizeof(regex_t));
if (regcomp(&preg, regex_rule, REG_EXTENDED) == 0) {
if (regexec(&preg, argv[1], nmatch, pmatch, 0) == 0) {
for (i = 0; i < nmatch; i++) {
if (pmatch[i].rm_so == -1) continue;
len = pmatch[i].rm_eo - pmatch[i].rm_so;
printf ("%.*s\n", len, (argv[1] + pmatch[i].rm_so));
}
}
regfree(&preg);
}
return 0;
}
运行输出:[beyes@beyes normal]$ ./regx 3adfaba883abcdak3kdfadfadfadsfa
883abc |