正则匹配流程:

  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:分别指自定义的用于存储错误信息的缓冲区及其大小

示例:

...

[02]APUE:POSIX 正则库(#include <regex.h>)的更多相关文章

  1. 使用POSIX正则库匹配一行中多个结果

    正则匹配与正则表达式是什么东西我就不说了,在这里说下POSIX这个c语言正则库在对字符串进行正则匹配时取出多个结果的问题. 首先简单说明下POSIX正则库的几个函数和使用方法 第一个函数:int re ...

  2. posix 正则库程序

    使用的是posix 正则库,参考: http://see.xidian.edu.cn/cpp/html/1428.html 执行匹配的时: gcc myreg.c ip.pat 内容: ip.*[0- ...

  3. C正则库做DNS域名验证时的性能对比

    C正则库做DNS域名验证时的性能对比   本文对C的正则库regex和pcre在做域名验证的场景下做评测. 验证DNS域名的正则表达式为: "^[0-9a-zA-Z_-]+(\\.[0-9a ...

  4. #include<unistd.h>存在linux中,含有系统服务的函数

    #include<unistd.h> linux标准库#include <unistd.h>与windows的#include <windows.h>(C语言开发) ...

  5. 在查找预编译头时遇到意外的文件结尾。是否忘记了向源中添加“#include "StdAfx.h"”?

    在查找预编译头时遇到意外的文件结尾.是否忘记了向源中添加“#include "StdAfx.h"”? 右键选择该文件.cpp格式的->属性->预编译头,→ 不使用预编译 ...

  6. 用 #include “filename.h” 格式来引用非标准库的头文件

    用 #include “filename.h” 格式来引用非标准库的头文件(编译器将 从用户的工作目录开始搜索) #include <iostream> /* run this progr ...

  7. 用 #include <filename.h> 格式来引用标准库的头文件

    用 #include <filename.h> 格式来引用标准库的头文件(编译器将从 标准库目录开始搜索). #include <iostream> /* run this p ...

  8. vs2013载入zlib库,即include "zlib.h"

    转自wo13142yanyouxin原文vs2013载入zlib库,即include "zlib.h" 在程序中,我们经常要用到压缩,解压函数.以压缩函数compress为例进行说 ...

  9. C++ 引用#include<math.h> 找不到动态库

    问题: 使用g++ 编译C++文件报错了,无法识别abs,可是我这文件中已经添加了#include<math.h>? 于是在指令中加入-lm g++ main.cpp AStar.cpp ...

随机推荐

  1. js和php语法区别

    参考 : https://www.wangjingxian.cn/php/51.html

  2. [NOIP模拟15]题解

    A.建设城市(city) 这容斥题多难啊你们是怎么考场切掉的啊 首先可以想一下,如果没有k的限制,这题怎么做? 相信你们肯定能看出来是挡板法裸题:m个物品分给n个人,每个人至少一个. 就是$C_{m- ...

  3. jQuery选择器 (详解)

    1. 基础选择器 Basics 名称 说明 举例 #id 根据元素Id选择 $("divId") 选择ID为divId的元素 element 根据元素的名称选择, $(" ...

  4. linux下vim编辑器查找 关键字

    在  linux  vim 编辑器 下查找   关键字 方法[一] 1?short_open_tag : 它的意思是vim 打开文件的第一行 ? : 它的意思是反向查找 short_open_tag ...

  5. windows每天定时执行脚本

     windows每天定时执行脚本 这里说的定时器就是Windows下的任务计划,当时遇到的坑正好总结一下,因为Windows10的定时器去执行脚本当时试了好多遍,都是没有成功,后来通过自己的观察发现是 ...

  6. FreeBSD_11-系统管理——{Part_1-xfce 桌面}

    一.首先安装 Xorg 安装 xorg pkg install xorg 清除旧文件(如果已前安装过 xorg) /etc/X11/xorg.conf /usr/local/etc/X11/xorg. ...

  7. HTML中<frameset>标签不显示的问题

    啥都不说,先上代码 <html> <head> <title>index</title> <meta content = 'text/html'; ...

  8. Spring-boot整合Redis,遇到的问题

    1.通过set进redis中的数据,get不到 String cityKey ="city_"+id; ValueOperations<String,City> ope ...

  9. 使用sublime+platUML快速画流程图

    程序员难免要经常画流程图,状态图,时序图等.以前经常用 visio 画,经常为矩形画多大,摆放在哪等问题费脑筋.有时候修改文字后,为了较好的显示效果不得不再去修改图形.今天介绍的工具是如何使用 Sub ...

  10. C# 记录循环消耗时间

    今天写了循环段代码,但是感觉好像性能很差的样子,就想看一下整个循环的执行时间,最开始我想到了DateTime.Now,但是诡异的是,如果我循环的次数比较少的话(少于30000次)就会发现2次时间间隔是 ...