[02]APUE:POSIX 正则库(#include <regex.h>)
正则匹配流程:
- 声明一个 regex_t 类型的变量(结构体)
- regcomp 函数会将“正则匹配条件”写入此结构体,并编译成特定的二进制格式(加快匹配速度)
- 声明一个 regmatch_t 类型的变量数组(结构体数组)
- 调用 regexec 函数将匹配结果写入此结构体数组
- 从此结构体数组中取出匹配结果
- 以上两个函数若出错返回非 0 值,则调用 regerror 函数显示错误内存
- 最后调用 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>)的更多相关文章
- 使用POSIX正则库匹配一行中多个结果
正则匹配与正则表达式是什么东西我就不说了,在这里说下POSIX这个c语言正则库在对字符串进行正则匹配时取出多个结果的问题. 首先简单说明下POSIX正则库的几个函数和使用方法 第一个函数:int re ...
- posix 正则库程序
使用的是posix 正则库,参考: http://see.xidian.edu.cn/cpp/html/1428.html 执行匹配的时: gcc myreg.c ip.pat 内容: ip.*[0- ...
- C正则库做DNS域名验证时的性能对比
C正则库做DNS域名验证时的性能对比 本文对C的正则库regex和pcre在做域名验证的场景下做评测. 验证DNS域名的正则表达式为: "^[0-9a-zA-Z_-]+(\\.[0-9a ...
- #include<unistd.h>存在linux中,含有系统服务的函数
#include<unistd.h> linux标准库#include <unistd.h>与windows的#include <windows.h>(C语言开发) ...
- 在查找预编译头时遇到意外的文件结尾。是否忘记了向源中添加“#include "StdAfx.h"”?
在查找预编译头时遇到意外的文件结尾.是否忘记了向源中添加“#include "StdAfx.h"”? 右键选择该文件.cpp格式的->属性->预编译头,→ 不使用预编译 ...
- 用 #include “filename.h” 格式来引用非标准库的头文件
用 #include “filename.h” 格式来引用非标准库的头文件(编译器将 从用户的工作目录开始搜索) #include <iostream> /* run this progr ...
- 用 #include <filename.h> 格式来引用标准库的头文件
用 #include <filename.h> 格式来引用标准库的头文件(编译器将从 标准库目录开始搜索). #include <iostream> /* run this p ...
- vs2013载入zlib库,即include "zlib.h"
转自wo13142yanyouxin原文vs2013载入zlib库,即include "zlib.h" 在程序中,我们经常要用到压缩,解压函数.以压缩函数compress为例进行说 ...
- C++ 引用#include<math.h> 找不到动态库
问题: 使用g++ 编译C++文件报错了,无法识别abs,可是我这文件中已经添加了#include<math.h>? 于是在指令中加入-lm g++ main.cpp AStar.cpp ...
随机推荐
- 思维+multiset优化——cf1249E
正着想很难,但是反着想就容易有思路 /* 将问题转化为 挑选最多的线段,每个点的覆盖次数不超过k次 multiset里存k个右端点,表示第i层当前的最远右端点,每次来一根新线段,能填就填进并更新,不能 ...
- python eval()内置函数
python有一个内置函数eval(),可以将字符串进行运行. 通过help(eval)查看帮助文档 Help on built-in function eval in module builtins ...
- vs2012+wdk8.0 搭建wdf驱动开发环境
开发环境搭建: 系统:win7 x64 工具:vs2012 + WDK8.0 插件:wdfcoinstaller.msi (1)先安装vs2012,再安装wdk8.0,这样在打开vs2012时可以创建 ...
- TLS/SSL 协议 - Server Certificate
Server Certificate 典型的Certificate消息用于携带服务器X.509证书链.证书链是以ASN.1 DER编码的一系列证书,一个接着一个组合而成.主证书必须第一个发送,中间证书 ...
- Redis启动Sentinel出现警告的解决
Redis 3.0.7版本启动时出现警告的解决办法 7283:M 12 Mar 12:13:33.749 # WARNING: The TCP backlog setting of 511 canno ...
- 1. USB协议
1.1 Packets USB总线上数据传输以包为基本单位,一个包含不同的域,但都要从同步域开始,然后跟踪一个包标识符PID(Packet Identifier),最终以包结束符EOP(End of ...
- 1067 Sort with Swap(0, i) (25 分)
Given any permutation of the numbers {0, 1, 2,..., N−1}, it is easy to sort them in increasing order ...
- IceCTF-Matrix
解题思路: 参考了鸽子小姐姐的脚本:https://zhuanlan.zhihu.com/p/22678856 具体题目就不贴了. 题目中提示将问题图像化,猜测是将这些16进制数转化为图像,尝试将16 ...
- Quartz特点
运行环境 Quartz 可以运行嵌入在另一个独立式应用程序 Quartz 可以在应用程序服务器(或servlet容器)内被实例化,并且参与XA事务 Quartz 可以作为一个独立的程序运行(其自己的J ...
- jenkins构建参数
$BUILD_NUMBER 构建序号 $WORKSPACE 工作目录 #!/bin/sh - chmod u+x mvnw./mvnw package -Pprod -Dmaven.test.skip ...