使用 PCRE2,在C语言中进行正则匹配的流程稍微复杂一点,因为它提供了非常强大的控制能力。
流程通常是:
配置上下文(可选,通常用默认)。
编译 (Compile):将正则字符串转换成内部结构。
匹配 (Match):在目标字符串中搜索。
提取结果:获取匹配到的子串(Capture Groups)。
清理内存。
这段代码演示了如何从字符串中提取一个邮箱地址,并打印出“整个匹配”以及“用户名部分(@之前的内容)”。
前提: 你需要安装 PCRE2 库。
Ubuntu/Debian: sudo apt install libpcre2-dev
CentOS/RHEL: sudo yum install pcre2-devel
macOS: brew install pcre2
编译时需要链接 pcre2-8 库(因为我们处理的是 8位 char)。
#define PCRE2_CODE_UNIT_WIDTH 8: 这是必须的,告诉头文件我们是处理标准的 C 字符串(char),而不是宽字符(16位或32位)。
pcre2_compile: 类似于 POSIX 的 regcomp,但它返回一个 pcre2_code 指针。如果失败,它不会返回错误码整数,而是返回 NULL,错误码写入参数 errornumber。
pcre2_match_data: 这是 PCRE2 比较独特的地方。它专门分配一块内存来存结果,不像 POSIX 那样直接传个结构体数组。这样设计是为了线程安全和灵活性。
ovector (Output Vector): 这是一个 size_t 数组。
ovector[0] 是整个匹配开始的索引。
ovector[1] 是整个匹配结束的索引。
ovector[2] 是第1个括号捕获组开始的索引。
ovector[3] 是第1个括号捕获组结束的索引。
以此类推...
%.*s: printf 的这个格式符很实用。它允许用两个参数来打印字符串:第一个参数是长度,第二个是字符串指针。因为 C 语言字符串必须以 \0 结尾,而正则匹配出来的是原始字符串中间的一段,没有 \0,用这个方法可以直接打印而不需要拷贝内存。
分享数字集成电路设计中的经验和方法。分享让工作更轻松。