PCRE2Project/pcre2
GitHub: PCRE2Project/pcre2
PCRE2 是一个成熟、高性能的 Perl 兼容正则表达式 C 库,支持 Unicode、JIT 编译和多种匹配引擎,广泛用于嵌入式文本匹配场景。
Stars: 1252 | Forks: 253
## 概述
PCRE2 库是一组实现**正则表达式模式匹配**的 C 函数。
它**自包含且可移植**,旨在易于**嵌入**到几乎**任何平台**或构建目标上的现有项目和构建系统中。
PCRE2 库是**免费且开源**的(BSD 许可证),并允许在专有软件中使用。
它支持 Unicode 匹配和非常广泛的正则表达式功能。它接受各种字符编码的输入,并可选择包含高性能的 **JIT 匹配引擎**。
PCRE2 **成熟且备受信赖**:捆绑在数十或数百个开源和商业产品中,例如 Excel、Safari、Apache 和 Git,并作为 PHP 和 R 等多种编程语言正则表达式的基础。
| 网站 |
https://pcre2project.github.io/pcre2/
|
| 分发 |
[](https://github.com/PCRE2Project/pcre2/releases)
[](https://github.com/PCRE2Project/pcre2/blob/main/LICENCE.md)
|
| 测试 |
[](https://app.codecov.io/gh/PCRE2Project/pcre2/components)
[](https://github.com/PCRE2Project/pcre2/actions/workflows/dev.yml)
[](https://github.com/PCRE2Project/pcre2/actions/workflows/clang-analyzer.yml)
[](https://github.com/PCRE2Project/pcre2/actions/workflows/dev.yml)
[](https://scan.coverity.com/projects/pcre2?tab=overview)
[](https://github.com/PCRE2Project/pcre2/actions/workflows/codeql.yml)
[](https://google.github.io/oss-fuzz/)
[](https://scorecard.dev/viewer/?uri=github.com%2FPCRE2Project%2Fpcre2)
|
| 平台 |
持续测试于 Linux, Windows, macOS, FreeBSD, OpenBSD, Solaris, z/OS;
x86, ARM, RISC-V, POWER, S390X; 已知可在其他平台运行
|
## 快速开始
显示脚本
```
# 使用 'git clone' 获取 PCRE2,或使用 curl/wget 下载 release。
# 在这里,我们使用 git 检出一个 release tag:
git clone https://github.com/PCRE2Project/pcre2.git ./pcre2 \
--branch pcre2-$PCRE2_VERSION \
-c advice.detachedHead=false --depth 1
# 如果使用 JIT,请记住获取 Git submodule:
(cd ./pcre2; git submodule update --init)
# 现在让我们构建 PCRE2:
(cd ./pcre2; \
cmake -G Ninja -DCMAKE_BUILD_TYPE=Debug \
-DPCRE2_SUPPORT_JIT=ON -B build; \
cmake --build build/)
# 很好,PCRE2 构建完成。
# 这是一个简短的演示,展示我们如何使用 PCRE2。
# 有关更完整的示例,请参阅 './pcre2/src/pcre2demo.c'。
# 请参阅下面的演示代码。
# 编译演示:
gcc -g -I./pcre2/build -L./pcre2/build demo.c -o demo -lpcre2-8
# 最后,运行我们的演示:
./demo 'c.t' 'dogs and cats'
# 我们成功获取、构建并调用了 PCRE2! :)
```
文件 `demo.c`:
```
/* Set PCRE2_CODE_UNIT_WIDTH to indicate we will use 8-bit input. */
#define PCRE2_CODE_UNIT_WIDTH 8
#include
#include /* for strlen */
#include /* for printf */
int main(int argc, char* argv[]) {
if (argc != 3) {
fprintf(stderr, "Usage: %s \n", argv[0]);
return 1;
}
const char *pattern = argv[1];
const char *subject = argv[2];
/* Compile the pattern. */
int error_number;
PCRE2_SIZE error_offset;
pcre2_code *re = pcre2_compile(
pattern, /* the pattern */
PCRE2_ZERO_TERMINATED, /* indicates pattern is zero-terminated */
0, /* default options */
&error_number, /* for error number */
&error_offset, /* for error offset */
NULL); /* use default compile context */
if (re == NULL) {
fprintf(stderr, "Invalid pattern: %s\n", pattern);
return 1;
}
/* Match the pattern against the subject text. */
pcre2_match_data *match_data =
pcre2_match_data_create_from_pattern(re, NULL);
int rc = pcre2_match(
re, /* the compiled pattern */
subject, /* the subject text */
strlen(subject), /* the length of the subject */
0, /* start at offset 0 in the subject */
0, /* default options */
match_data, /* block for storing the result */
NULL); /* use default match context */
/* Print the match result. */
if (rc == PCRE2_ERROR_NOMATCH) {
printf("No match\n");
} else if (rc < 0) {
fprintf(stderr, "Matching error\n");
} else {
PCRE2_SIZE *ovector = pcre2_get_ovector_pointer(match_data);
printf("Found match: '%.*s'\n", (int)(ovector[1] - ovector[0]),
subject + ovector[0]);
}
pcre2_match_data_free(match_data); /* Free resources */
pcre2_code_free(re);
return 0;
}
```
获取 PCRE2 的主要方式有:
1. 通过 Git clone:
git clone https://github.com/PCRE2Project/pcre2.git
请务必在生产环境中使用 release tag,而不是开发分支!
因为 PCRE2 的 JIT 使用来自 Git submodule 的代码,必须在全新克隆后将其检出:
git submodule update --init
2. 下载 [release tarball](https://github.com/PCRE2Project/pcre2/releases/latest)。
3. 最后,PCRE2 也由各种下游包管理器捆绑分发(例如 Linux 发行版或 [vcpkg](https://vcpkg.io/))。这些由第三方提供,而非 PCRE2 项目。
构建 PCRE2 的主要方式有:
1. 通过 CMake (Linux/Windows/macOS 等)
cd pcre2/
cmake -B build .
cmake --build build/
2. 通过 Autoconf (Linux/Unix)
cd pcre2/
./configure
make
请参阅下方的 ["平台"](#platforms) 链接以获取更详细的构建文档。
## API 概述
PCRE2 API 支持 8-bit、16-bit 和 32-bit 编码的字符串,支持或不支持 UTF 编码。此外还支持 EBCDIC。
默认的正则表达式方言在语法和行为上与 Perl 5 紧密匹配,并包含 PCRE2 特有的扩展。可以向 PCRE2 API 传递各种细粒度的标志,以对其进行自定义,从而更紧密地遵循其他方言,如 JavaScript 或 Python。
默认的匹配引擎使用带有回溯的深度优先树搜索,该功能非常丰富,但最坏情况下的时间复杂度为指数级(如果超过时间限制,PCRE2 允许中止匹配,该限制表示为树搜索中的最大步数)。第二个匹配引擎使用 JIT 以大幅提高性能,将正则表达式编译为等效的本地机器码块。
PCRE2 有第三个匹配引擎,使用 DFA 引擎,该引擎通常较慢,但最坏情况下具有多项式匹配时间,并且能够找到 POSIX 风格的“最长最左”匹配。
随附的实用程序函数用于将 glob 模式和 POSIX BRE/ERE 模式转换为 PCRE2 正则表达式;还用于执行高级正则表达式操作,例如使用强大的替换字符串语法进行搜索和替换。
除了 PCRE2 API 之外,该库还提供兼容 POSIX 的 `
` 头文件和 `regexec()` 函数。但是,这不支持传递 PCRE2 标志,因此我们建议用户尽可能使用 PCRE2 API。
有关更多详细信息,请参阅 [完整的库和 API 文档](https://pcre2project.github.io/pcre2/doc/)。
有关第三方文档,另请参阅:
- 每个 PCRE 版本的精选更改摘要,以及关于 PCRE2 的一些优秀教程,请见
[RexEgg 网站](http://www.rexegg.com/pcre-documentation.html)。
- Jan Goyvaerts 流行的 Regular-Expressions.info 网站包含 [关于 PCRE2 的信息](https://www.regular-expressions.info/pcre.html) 以及教程和 PCRE2 与其他正则表达式方言的详细比较。
- Jeffrey Friedl 的著作 [_Mastering Regular Expressions_](https://regex.info/book.html) 包含关于 Perl 和 PCRE 的章节,可通过 O'Reilly Media 获得印刷版和在线版。
## 平台
PCRE2 是可移植的 C 代码,很可能在任何具有 C99 编译器的系统上运行。
- 操作系统
-
我们在 Linux (GCC 和 Clang, glibc 和 musl)、Windows (MSVC 和 MinGW-x64) 和 macOS (Clang),以及 FreeBSD、OpenBSD、Solaris (Oracle Studio
cc) 和 z/OS (xlc 和 ibm-clang) 上进行持续集成测试。
- 处理器
-
PCRE2 在 x86 (i686 和 amd64)、ARM 32 位和 64 位 (armv7 和 aarch64)、RISC-V (riscv64)、POWER (ppc64le) 以及大端序 S390x 上持续测试。
其他系统也可能运行(包括移动设备、嵌入式平台和商业 UNIX 系统),但 PCRE2 维护者并未对其进行持续测试。鼓励用户在为任何新平台编译时运行完整的 PCRE2 测试套件。我们知道有可运行的 VMS 和 z/OS 移植版本(PCRE2 支持 EBCDIC)。
PCRE2 版本支持使用 CMake 构建,对于 UNIX 平台,包含一个由 Autoconf 构建的 `./configure` 脚本。还包括用于 Bazel 构建系统和 `zig build` 的构建文件。可以通过将 `.c` 文件包含在现有项目中来将 PCRE2 与其他系统集成。
请查阅文件 [README](./README) 和 [NON-AUTOTOOLS-BUILD](./NON-AUTOTOOLS-BUILD) 以获取完整的构建文档,以及手册页,包括 [`man pcre2/doc/pcre2build.3`](https://pcre2project.github.io/pcre2/doc/pcre2build/)。
## 许可证
PCRE2 在 **BSD 3-clause 许可证**下发布,带有 PCRE2 例外条款。它是开源的,且对企业友好。
- 有关法律文本,请参阅 [LICENCE](./LICENCE.md)。
- 有关 PCRE2 当前维护者及其贡献者的致谢详情(包括原作者 Philip Hazel),请参阅 [AUTHORS](./AUTHORS.md)。
## 贡献与支持
通过 [GitHub issues](https://github.com/PCRE2Project/pcre2/issues) 报告问题或提问来加入社区。我们欢迎反馈和建议。
欢迎从错误修复到功能请求的各种贡献,可以通过 GitHub pull requests 进行。
请查阅我们的 [SECURITY](./SECURITY.md) 政策以获取有关报告安全问题的信息。
版本发布公告将通过 [pcre2-dev@googlegroups.com](https://groups.google.com/g/pcre2-dev) 邮件列表发布,您也可以在那里发起关于 PCRE2 问题和开发的讨论。您可以浏览[列表存档](https://groups.google.com/g/pcre2-dev)。 标签:Bash脚本, JIT编译, PCRE2, PHP底层, Unicode, 基础组件, 客户端加密, 嵌入式, 库, 应急响应, 开源, 文本处理, 模式匹配, 自动化资产收集, 解析器