曲径通幽论坛

 找回密码
 立即注册
搜索
查看: 4831|回复: 0
打印 上一主题 下一主题

[常规] regexec() -- 执行正则表达式查找

[复制链接]

4918

主题

5880

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34397
跳转到指定楼层
楼主
发表于 2012-1-9 10:00:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
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
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|曲径通幽 ( 琼ICP备11001422号-1|公安备案:46900502000207 )

GMT+8, 2025-6-18 19:26 , Processed in 0.067258 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表