曲径通幽论坛

标题: regexec() -- 执行正则表达式查找 [打印本页]

作者: beyes    时间: 2012-1-9 10:00
标题: regexec() -- 执行正则表达式查找
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.rm_so == -1) continue;
               
                len = pmatch.rm_eo - pmatch.rm_so;
                printf ("%.*s\n", len, (argv[1] + pmatch.rm_so));
            }
        }
        regfree(&preg);
    }

    return 0;
}

运行输出:
[beyes@beyes   normal]$ ./regx 3adfaba883abcdak3kdfadfadfadsfa
883abc





欢迎光临 曲径通幽论坛 (http://www.groad.net/bbs/) Powered by Discuz! X3.2