正则表达式工具 |
grep |
PowerGREP |
RegexBuddy |
RegexMagic |
通用应用程序 |
EditPad Lite |
EditPad Pro |
语言和库 |
Boost |
Delphi |
GNU (Linux) |
Groovy |
Java |
JavaScript |
.NET |
PCRE (C/C++) |
PCRE2 (C/C++) |
Perl |
PHP |
POSIX |
PowerShell |
Python |
R |
Ruby |
std::regex |
Tcl |
VBScript |
Visual Basic 6 |
wxWidgets |
XML Schema |
Xojo |
XQuery 和 XPath |
XRegExp |
数据库 |
MySQL |
Oracle |
PostgreSQL |
此网站上的更多内容 |
简介 |
正则表达式快速入门 |
正则表达式教程 |
替换字符串教程 |
应用程序和语言 |
正则表达式示例 |
正则表达式参考 |
替换字符串参考 |
书评 |
可打印 PDF |
关于此网站 |
RSS 源和博客 |
PCRE 是 Perl 兼容正则表达式的简称。它是 Philip Hazel 用 C 语言编写的一个开源库的名称。该库与大量 C 编译器和操作系统兼容。许多人从 PCRE 派生出库,使其与其他编程语言兼容。PHP(7.3.0 之前)、Delphi、R(4.0.0 之前)和 Xojo (REALbasic) 附带的正则表达式功能都基于 PCRE。该库还包含在许多 Linux 发行版中,作为共享 .so 库和 .h 头文件。
尽管 PCRE 声称与 Perl 兼容,但 Perl 和 PCRE 的当代版本之间存在足够的差异,可以将它们视为不同的正则表达式风格。Perl 的最新版本甚至从 PCRE 复制了 PCRE 在 Perl 之前从其他编程语言复制的功能,以使 Perl 更兼容 PCRE。如今,PCRE 的使用比 Perl 更广泛,因为 PCRE 是许多库和应用程序的一部分。
Philip Hazel 最近发布了一个名为 PCRE2 的新库。第一个 PCRE2 版本被赋予版本号 10.00,以与之前的 PCRE 8.36 明确区分。未来的 PCRE 版本将仅限于修复错误。新功能将仅进入 PCRE2。如果您正在进行新的开发项目,则应考虑使用 PCRE2 而不是 PCRE。但对于已经使用 PCRE 的现有项目,最好坚持使用 PCRE。从 PCRE 迁移到 PCRE2 需要对源代码进行重大更改(但不需要对正则表达式进行更改)。
您可以在 https://www.pcre.org/ 找到有关 PCRE 和 PCRE2 的更多信息。
使用 PCRE 非常简单。在使用正则表达式之前,需要将其转换为二进制格式以提高效率。为此,只需调用 pcre_compile(),并将正则表达式作为以 null 结尾的字符串传递即可。该函数返回指向二进制格式的指针。除了将其传递给其他 pcre 函数之外,您无法对结果执行任何操作。
要使用正则表达式,请调用 pcre_exec(),传递 pcre_compile() 返回的指针、您要搜索的字符数组以及数组中的字符数(不必以 null 结尾)。您还需要传递一个指向整数数组的指针,其中 pcre_exec() 存储结果,以及以整数表示的数组长度。数组的长度应等于您要支持的 捕获组 的数量,加上一个(用于整个正则表达式匹配),乘以三 (!)。如果找不到匹配项,该函数返回 -1。否则,它返回已填充的捕获组数加一。如果数组中容纳的组数过多,它将返回 0。结果数组中的前两个整数分别包含正则表达式匹配的开始位置(从数组开始处按字节计数)和正则表达式匹配中的字节数。以下整数对包含反向引用的开始位置和长度。因此,array[n*2] 是捕获组 n 的开始位置,array[n*2+1] 是捕获组 n 的长度,其中捕获组 0 是整个正则表达式匹配。
当您完成正则表达式时,请使用 pcre_compile() 返回的指针调用 pcre_dispose(),以防止内存泄漏。
原始 PCRE 库仅支持正则表达式匹配,它做得很好。它不提供对搜索和替换、字符串拆分等的支持。这可能看起来不是一个主要问题,因为您可以在自己的代码中轻松完成这些操作。然而,不幸的后果是,所有使用 PCRE 进行正则表达式匹配的编程语言和库在拆分字符串时都有自己的替换文本语法和自己的特殊性。新的 PCRE2 库确实支持搜索和替换。
默认情况下,PCRE 在没有 Unicode 支持的情况下编译。如果您尝试在正则表达式中使用 \p、\P 或 \X,PCRE 将抱怨它是在没有 Unicode 支持的情况下编译的。
要使用 Unicode 支持编译 PCRE,您需要定义 SUPPORT_UTF8 和 SUPPORT_UCP 条件定义。如果 PCRE 的配置脚本在您的系统上运行,您可以在运行 make 之前轻松地通过运行 ./configure --enable-unicode-properties 来执行此操作。本网站上的 正则表达式教程 假设您已使用这些选项编译了 PCRE,并且所有其他选项都设置为其默认值。
PCRE 的一个独特功能是“回调”。如果您在正则表达式中的任何位置放置
至 ,当 PCRE 在匹配尝试期间到达回调时,它会调用 pcre_callout 函数。默认情况下,PCRE 使用 8 位字符串,其中每个字符为一个字节。您可以将 PCRE_UTF8 作为第二个参数传递给 pcre_compile()(可能与其他风格结合使用二进制或),以告诉 PCRE 将您的正则表达式解释为 UTF-8 字符串。当您这样做时,pcre_match() 也会自动使用 UTF-8 解释主题字符串。
如果您有 PCRE 8.30 或更高版本,则可以通过在运行 make 之前将 --enable-pcre16 传递给 configure 脚本来启用 UTF-16 支持。然后,如果您的正则表达式和主题字符串存储为 UTF-16,则可以将 PCRE_UTF16 传递给 pcre16_compile(),然后使用 pcre16_match() 进行匹配。UTF-16 对高达 U+FFFF 的代码点使用两个字节,对更高的代码点使用四个字节。在 Visual C++ 中,wchar_t 字符串使用 UTF-16。确保不要混用 pcre_ 和 pcre16_ 函数非常重要。PCRE_UTF8 和 PCRE_UTF16 常量实际上是相同的。您需要使用 pcre16_ 函数来获取 UTF-16 版本。
如果您有 PCRE 8.32 或更高版本,则可以通过在运行 make 之前将 --enable-pcre32 传递给 configure 脚本来启用 UTF-16 支持。然后,如果您的正则表达式和主题字符串存储为 UTF-32,则可以将 PCRE_UTF32 传递给 pcre32_compile(),然后使用 pcre32_match() 进行匹配。UTF-32 每字符使用四个字节,在 Linux 上的内存中 Unicode 字符串中很常见。确保不要将 pcre32_ 函数与 pcre16_ 或 pcre_ 集混用非常重要。同样,PCRE_UTF8 和 PCRE_UTF32 常量是相同的。您需要使用 pcre32_ 函数来获取 UTF-32 版本。
| 快速入门 | 教程 | 工具和语言 | 示例 | 参考 | 书籍评论 |
| grep | PowerGREP | RegexBuddy | RegexMagic |
| EditPad Lite | EditPad Pro |
| Boost | Delphi | GNU (Linux) | Groovy | Java | JavaScript | .NET | PCRE (C/C++) | PCRE2 (C/C++) | Perl | PHP | POSIX | PowerShell | Python | R | Ruby | std::regex | Tcl | VBScript | Visual Basic 6 | wxWidgets | XML 模式 | Xojo | XQuery 和 XPath | XRegExp |
| MySQL | Oracle | PostgreSQL |
页面 URL:https://regexper.cn/pcre.html
页面上次更新时间:2021 年 8 月 24 日
网站上次更新时间:2024 年 3 月 15 日
版权所有 © 2003-2024 Jan Goyvaerts。保留所有权利。