zoukankan      html  css  js  c++  java
  • [02]APUE:POSIX 正则库(#include <regex.h>)

    正则匹配流程:

    1. 声明一个 regex_t 类型的变量(结构体)
    2. regcomp 函数会将“正则匹配条件”写入此结构体,并编译成特定的二进制格式(加快匹配速度)
    3. 声明一个 regmatch_t 类型的变量数组(结构体数组)
    4. 调用 regexec 函数将匹配结果写入此结构体数组
    5. 从此结构体数组中取出匹配结果
    6. 以上两个函数若出错返回非 0 值,则调用 regerror 函数显示错误内存
    7. 最后调用 regfree 函数释放 regex_t 类型变量的资源
    #include <sys/types.h>
    #include <regex.h>
    
    int regcomp(regex_t *preg, const char *regex, int cflags);
    int regexec(const regex_t *preg, const char *string, size_t nmatch, regmatch_t pmatch[], int eflags);
    size_t regerror(int errcode, const regex_t *preg, char *errbuf, size_t errbuf_size);
    void regfree(regex_t *preg);
    • regcomp 函数
      • regex 参数是预定义的正则表达式字符串
      • cflags 用于指定编译特性,可用参数如下
        • REG_EXTENDED:启用扩展正则表达式规则,默认是基本正则表达式规则
        • REG_ICASE:忽略大小写
        • REG_NOSUB:仅检查是否存在匹配项,不返回结果
        • REG_NEWLINE:换行符以常规语义对待,默认换行符不具有特殊含义,跟普通字符一样参与匹配
    • regexec 函数
      • 此处的 string 参数指将要对其进行匹配的目标字符串
      • pmatch[] 参数用于存储匹配到的结果(若 REG_NOSUB 编译选项被设置,则此参数将被忽略)
        • 此类型的结构体至少包含两个 regoff_t(某种整型数据,至少大于 off_t 或 size_t 的取值范围) 类型的成员:rm_so(即 regex match start offset)、rm_eo(即 regex match end offset),每个匹配到的结果都以其在目标字符串中的起始偏移位置标识
        • typedef struct {
              regoff_t    rm_so;
              regoff_t    rm_eo;
          } regmatch_t; 
        • 未被填入匹配结果的项(即没有用到的结构体),其内部成员均被赋值为 -1,处理结果的时候可以以此为判断依据
        • pmatch[] 的成员数量不能小于 nmatch 指定的数值,其中 pmatch[0] 存储的是目标字符串的地址(即 string 参数所代表的地址),从 pmatch[1] 开始的数组成员存储的是匹配结果的边界偏移量,因此 nmatch 应当指定为 N + 1,其中 N 是预期想要取得的匹配项数量
      • eflags 用于定制匹配特性,可用参数如下
        • REG_NOTBOL:即 not begin of line,在不启用 REG_NEWLINE 编译参数的前提下,以 ^ 匹配行首的将总是返回无匹配结果
        • REG_NOTEOL:即 not end of line,语义同上,即不指定 REG_NEWLINE 情况下,永远匹配不到 $ 行尾
    • regerror 函数
      • errcode:指 regcomp 或 regexec 函数的返回值
      • preg:指经过 regcomp 处理过正则匹配条件
      • errbuf 及 errbuf_size:分别指自定义的用于存储错误信息的缓冲区及其大小

    示例:

     ...

  • 相关阅读:
    sshkey批量分发,管理方案
    sersync 配合rsync实时同步备份
    全网实时热备inotify+rsync
    rsync定时同步配置
    全网NFS存储架构详解与分析
    linux新装系统初始化
    Cannot create a secure XMLInputFactory --CXF调用出错
    POJ 2187 /// 凸包入门 旋转卡壳
    POJ 1127 /// 判断线段与线段是否相交
    POJ 2398 map /// 判断点与直线的位置关系
  • 原文地址:https://www.cnblogs.com/hadex/p/6550042.html
Copyright © 2011-2022 走看看