PCRE2Project/pcre2

GitHub: PCRE2Project/pcre2

PCRE2 是一个成熟、高性能的 Perl 兼容正则表达式 C 库,支持 Unicode、JIT 编译和多种匹配引擎,广泛用于嵌入式文本匹配场景。

Stars: 1252 | Forks: 253

PCRE2: Perl-Compatible Regular Expressions ## 概述 PCRE2 库是一组实现**正则表达式模式匹配**的 C 函数。 它**自包含且可移植**,旨在易于**嵌入**到几乎**任何平台**或构建目标上的现有项目和构建系统中。 PCRE2 库是**免费且开源**的(BSD 许可证),并允许在专有软件中使用。 它支持 Unicode 匹配和非常广泛的正则表达式功能。它接受各种字符编码的输入,并可选择包含高性能的 **JIT 匹配引擎**。 PCRE2 **成熟且备受信赖**:捆绑在数十或数百个开源和商业产品中,例如 Excel、Safari、Apache 和 Git,并作为 PHP 和 R 等多种编程语言正则表达式的基础。
网站 https://pcre2project.github.io/pcre2/
分发 [![GitHub Release](https://img.shields.io/github/v/release/PCRE2Project/pcre2?display_name=release&style=flat-square&label=Latest%20release&color=006094)](https://github.com/PCRE2Project/pcre2/releases)  [![BSD licence](https://img.shields.io/badge/Licence-BSD%203--clause-006094?style=flat-square)](https://github.com/PCRE2Project/pcre2/blob/main/LICENCE.md)
测试 [![Codecov](https://img.shields.io/codecov/c/github/PCRE2Project/pcre2?component=library&style=flat-square&logo=codecov&label=Coverage&color=009400)](https://app.codecov.io/gh/PCRE2Project/pcre2/components)  [![Clang Sanitizers](https://img.shields.io/badge/Clang-Sanitizers-262D3A?style=flat-square&logo=llvm&color=006094)](https://github.com/PCRE2Project/pcre2/actions/workflows/dev.yml)  [![Clang Static Analyzer](https://img.shields.io/badge/Clang-Static%20Analyzer-262D3A?style=flat-square&logo=llvm&color=006094)](https://github.com/PCRE2Project/pcre2/actions/workflows/clang-analyzer.yml)  [![Valgrind](https://img.shields.io/badge/Valgrind-006094?style=flat-square)](https://github.com/PCRE2Project/pcre2/actions/workflows/dev.yml)  [![Coverity Scan](https://img.shields.io/coverity/scan/pcre2?style=flat-square&label=Coverity&color=009400)](https://scan.coverity.com/projects/pcre2?tab=overview)  [![CodeQL](https://img.shields.io/badge/GitHub-CodeQL-006094?style=flat-square)](https://github.com/PCRE2Project/pcre2/actions/workflows/codeql.yml)  [![OSS-Fuzz](https://img.shields.io/badge/Google-OSS--Fuzz-006094?style=flat-square)](https://google.github.io/oss-fuzz/)  [![OSSF-Scorecard Score](https://img.shields.io/ossf-scorecard/github.com/PCRE2Project/pcre2?style=flat-square&label=OSSF-Scorecard&color=009400)](https://scorecard.dev/viewer/?uri=github.com%2FPCRE2Project%2Fpcre2) 
平台 持续测试于 Linux, Windows, macOS, FreeBSD, OpenBSD, Solaris, z/OS;
x86, ARM, RISC-V, POWER, S390X; 已知可在其他平台运行
## 快速开始 Recording of a terminal session showing the PCRE2 quickstart; reproduced in text form below
显示脚本 ``` # 使用 '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),以及 FreeBSDOpenBSDSolaris (Oracle Studio cc) 和 z/OS (xlcibm-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, 基础组件, 客户端加密, 嵌入式, 库, 应急响应, 开源, 文本处理, 模式匹配, 自动化资产收集, 解析器