阿杰,我给你整理一份 PCRE(Perl Compatible Regular Expressions)正则库及用法详解,包括概念、安装、常用函数和示例。
一、什么是 PCRE
- 全称:Perl Compatible Regular Expressions
- 作用:提供与 Perl 正则表达式兼容的 正则功能库,用于各种编程语言(C、PHP、Python、Java 等)或工具(grep、sed、nginx)中。
- 特点:
- 完全兼容 Perl 正则语法
- 支持复杂模式匹配(环视、非捕获组、重复限定符)
- 高性能,支持编译正则提高匹配速度
二、PCRE 库安装
1. Linux 安装(Ubuntu/Debian)
sudo apt-get update
sudo apt-get install libpcre3 libpcre3-dev
2. CentOS / RHEL
sudo yum install pcre pcre-devel
3. 验证
pcregrep
是支持 PCRE 的 grep 工具
三、PCRE 常用函数(C 语言示例)
函数 | 说明 |
---|
pcre_compile() | 编译正则表达式,返回编译后的模式对象 |
pcre_exec() | 执行匹配操作 |
pcre_study() | 优化正则,提升匹配速度 |
pcre_free() | 释放编译后的模式对象 |
pcre_fullinfo() | 获取正则信息(捕获组数等) |
1. 基本用法(C 示例)
#include <stdio.h>
#include <pcre.h>
int main() {
const char *error;
int erroffset;
pcre *re;
const char *pattern = "a(b*)c"; // 正则模式
const char *subject = "abbbc";
re = pcre_compile(pattern, 0, &error, &erroffset, NULL);
if (!re) {
printf("PCRE compilation failed at offset %d: %s\n", erroffset, error);
return 1;
}
int ovector[30]; // 存放匹配结果
int rc = pcre_exec(re, NULL, subject, strlen(subject), 0, 0, ovector, 30);
if (rc >= 0) {
printf("Match found!\n");
} else {
printf("No match.\n");
}
pcre_free(re);
return 0;
}
四、常用正则语法(Perl 风格)
语法 | 说明 | 示例 |
---|
. | 匹配任意字符 | a.b → 匹配 acb |
* | 0 或多个重复 | ab* → a , ab , abb |
+ | 1 或多个重复 | ab+ → ab , abb |
? | 0 或 1 次 | ab? → a , ab |
[] | 字符集 | [a-z] → 匹配任意小写字母 |
() | 捕获分组 | (abc)+ → 捕获多个 abc |
(?: ) | 非捕获分组 | (?:abc)+ |
\d | 数字 [0-9] | \d{3} → 三位数字 |
\w | 单词字符 [a-zA-Z0-9_] | \w+ → 单词 |
^ / $ | 行首 / 行尾 | ^Hello / world$ |
(?=...) | 正向前瞻 | \d(?=px) → 匹配数字后面跟 px |
(?!...) | 负向前瞻 | \d(?!px) → 数字后不是 px |
五、工具示例
1. 使用 pcregrep
匹配文件
pcregrep "error|fail" logfile.txt
2. 高亮匹配
pcregrep --color "TODO" *.c
3. 递归匹配
pcregrep -r "FIXME" /home/project
六、PCRE 与其他正则库对比
库 | 特点 | 适用场景 |
---|
PCRE | 完全兼容 Perl 正则,支持高级语法 | C、PHP、nginx、grep 等 |
POSIX regex | 基础正则语法 | 传统 Unix 工具 |
Python re | 内置支持,语法类似 Perl | Python 脚本 |
Java java.util.regex | Java 内置正则 | Java 项目 |
七、小结
- PCRE 核心价值:在 C/C++ 或系统工具中使用 Perl 风格正则
- 优势:
- 常见应用:
- 日志分析 (
pcregrep
)
- Nginx 配置匹配
- C/C++ 项目字符串处理
发表回复