快速开始
教程
工具和语言
示例
参考
书评
正则表达式工具
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
本网站上的更多内容
简介
正则表达式快速入门
正则表达式教程
替换字符串教程
应用程序和语言
正则表达式示例
正则表达式参考
替换字符串参考
书评
可打印 PDF
关于本网站
RSS 提要和博客
RegexBuddy—The best regex editor and tester for wxWidgets developers!

wxWidgets 支持三种正则表达式风格

wxWidgets 使用 Henry Spencer 为 Tcl 8.2 开发的完全相同的正则表达式引擎。这意味着 wxWidgets 支持相同的三种正则表达式风格:Tcl 高级正则表达式POSIX 扩展正则表达式POSIX 基本正则表达式。与 Tcl 不同,ERE 而不是功能更强大的 ARE 是默认设置。wxRegEx::Replace() 方法对替换文本使用与 Tcl 的 regsub 命令相同的语法。

wxRegEx 类

要使用 wxWidgets 正则表达式引擎,您需要实例化 wxRegEx 类。该类有两个构造函数。wxRegEx() 创建一个空正则表达式对象。在使用该对象之前,您必须调用 wxRegEx::Compile()。在您执行此操作之前,wxRegEx::IsValid 将返回 false。

wxRegEx(const wxString& expr, int flags = wxRE_EXTENDED) 创建一个带有已编译正则表达式的 wxRegEx 对象。即使您的正则表达式无效,构造函数也会始终创建该对象。检查 wxRegEx::IsValid 以确定正则表达式是否已成功编译。

bool wxRegEx::Compile(const wxString& pattern, int flags = wxRE_EXTENDED) 编译正则表达式。您可以在任何 wxRegEx 对象上调用此方法,包括已包含已编译正则表达式的对象。这样做只会替换 wxRegEx 对象持有的正则表达式。将您的正则表达式作为字符串传递为第一个参数。第二个参数允许您设置某些匹配选项。

要设置正则表达式风格,请指定 wxRE_EXTENDED、wxRE_ADVANCED 或 wxRE_BASIC 中的一个标志。如果您指定一种风格,wxRE_EXTENDED 是默认值。我建议您始终指定 wxRE_ADVANCED 标志。ARE 比 ERE 强大得多。每个有效的 ERE 也是一个有效的 ARE,并且会产生相同的结果。使用 ERE 风格的唯一原因是当在没有“内置”正则表达式库(即 Henry Spencer 的代码)的情况下编译 wxWidgets 时,您的代码必须起作用。

除了风格之外,您还可以设置其他三个标志。wxRE_ICASE 使正则表达式不区分大小写。默认情况下区分大小写。wxRE_NOSUB 使正则表达式引擎将所有 捕获组 视为非捕获组。这意味着您将无法在替换文本中使用反向引用,或查询每个捕获组匹配的正则表达式部分。如果您无论如何都不会使用这些功能,设置 wxRE_NOSUB 标志会提高性能。

Tcl 部分所述,Henry Spencer 的“ARE”正则表达式引擎取消了令人困惑的“单行”(?s) 和“多行”(?m) 匹配模式,用同样令人困惑的“非换行符敏感”(?s)、“部分换行符敏感”(?p)、“反向部分换行符敏感”(?w) 和“换行符敏感匹配”(?n) 替换了它们。由于 wxRegEx 类封装了 ARE 引擎,因此当您在正则表达式中使用模式修饰符时,它支持所有 4 种模式。但 flags 参数只允许您设置两个。

如果您将 wxRE_NEWLINE 添加到标志中,则会启用“区分换行符的匹配”(?n)。在此模式下,将不匹配换行符 (\n)。插入符号和美元符号将在字符串中的换行符前后以及主题字符串的开头和结尾处匹配。

如果您未设置 wxRE_NEWLINE 标志,则默认值为“不区分换行符”(?s)。在此模式下,将匹配所有字符,包括换行符 (\n)。插入符号和美元符号将仅在主题字符串的开头和结尾处匹配。请注意,此默认值与 Perl 和地球上所有其他正则表达式引擎中的默认值不同。在 Perl 中,默认情况下,点不匹配换行符,插入符号和美元符号仅在主题字符串的开头和结尾处匹配。在 wxWidgets 中设置此模式的唯一方法是在正则表达式的开头放置(?p)

将所有内容放在一起,wxRegex(_T("(?p)^[a-z].*$"), wxRE_ADVANCED + wxRE_ICASE) 将检查您的主题字符串是否由以字母开头的单行组成。Perl 中的等效项为m/^[a-z].*$/i

wxRegEx 状态函数

wxRegEx::IsValid() 在 wxRegEx 对象保存已编译的正则表达式时返回 true。

wxRegEx::GetMatchCount() 的命名很差。它不会返回Matches() 找到的匹配项数。事实上,您可以在调用Matches之前,在Compile()之后立即调用GetMatchCount()GetMatchCount() 返回正则表达式中捕获组的数量,加上整个正则表达式匹配项的数量。您可以使用它来确定可以在替换文本中使用的反向引用的数量,以及可以传递给GetMatch() 的最高索引。如果您的正则表达式没有捕获组,GetMatchCount() 将返回 1。在这种情况下,\0 是您可以在替换文本中使用的唯一有效的反向引用。

如果发生错误,GetMatchCount() 将返回 0。如果 wxRegEx 对象不保存已编译的正则表达式,或者您使用 wxRE_NOSUB 编译了它,就会发生这种情况。

查找和提取匹配项

如果您想测试正则表达式是否与字符串匹配,或者提取正则表达式匹配的子字符串,您首先需要调用 wxRegEx::Matches() 方法。它有 3 种变体,允许您将 wxChar 或 wxString 作为主题字符串传递。在使用 wxChar 时,您可以将长度指定为第三个参数。如果您不这样做,将调用 wxStrLen() 来计算长度。如果您计划循环处理字符串中的所有正则表达式匹配,您应该在循环外自己调用 wxStrLen(),并将结果传递给 wxRegEx::Matches()。

bool wxRegEx::Matches(const wxChar* text, int flags = 0) const
bool wxRegEx::Matches(const wxChar* text, int flags, size_t len) const
bool wxRegEx::Matches(const wxString& text, int flags = 0) const

如果正则表达式与您在 text 参数中传递的主题字符串的全部或部分匹配,Matches() 返回 true。如果您想设置正则表达式是否与整个主题字符串匹配,请将 锚点 添加到正则表达式。

不要将 flags 参数与您传递给 Compile() 方法或 wxRegEx() 构造函数的参数混淆。所有风格和匹配模式选项只能在编译正则表达式时设置。

Matches() 方法只允许两个标志:wxRE_NOTBOL 和 wxRE_NOTEOL。如果您设置 wxRE_NOTBOL,则 ^\A 将不会在字符串的开头匹配。如果您启用了该匹配模式,它们仍将在嵌入换行符后匹配。同样,指定 wxRE_NOTEOL 告诉 $\Z 不要在字符串的末尾匹配。

wxRE_NOTBOL 通常用于实现“查找下一个”例程。wxRegEx 类不提供此类函数。要查找字符串中的第二个匹配项,您需要调用 wxRegEx::Matches() 并将第一个匹配项之后的原始主题字符串部分传递给它。传递 wxRE_NOTBOL 标志以表明您已截断正在传递的字符串的开头。

如果您正在处理大量数据,并且您想在读取全部数据之前应用正则表达式,wxRE_NOTEOL 可能会很有用。只要您尚未读取整个字符串,就在调用 wxRegEx::Matches() 时传递 wxRE_NOTEOL。在对不完整数据执行“查找下一个”时同时传递 wxRE_NOTBOL 和 wxRE_NOTEOL。

在对 Matches() 的调用返回 true 之后,并且您在没有 wxRE_NOSUB 标志的情况下编译了正则表达式,您可以调用 GetMatch() 来获取有关整体正则表达式匹配的详细信息,以及由正则表达式中的 捕获组 匹配的字符串部分。

bool wxRegEx::GetMatch(size_t* start, size_t* len, size_t index = 0) const 检索匹配在主题字符串中的起始位置和匹配中的字符数。

wxString wxRegEx::GetMatch(const wxString& text, size_t index = 0) const 返回匹配的文本。

对于这两个调用,将 index 参数设置为零(或省略它)以获取整体正则表达式匹配。将 1 <= index < GetMatchCount() 设置为获取正则表达式中捕获组的匹配。要确定组的编号,从左到右计算正则表达式中的左括号。

搜索和替换

wxRegEx 类提供三种方法来执行搜索和替换。Replace() 是执行实际工作的函数。你可以使用 ReplaceAll()ReplaceFirst() 作为更易读的方式来指定 Replace() 的第三个参数。

int wxRegEx::ReplaceAll(wxString* text, const wxString& replacement) constreplacement 替换 text 中的所有正则表达式匹配。

int wxRegEx::ReplaceFirst(wxString* text, const wxString& replacement) constreplacement 替换 text 中正则表达式的第一个匹配。

int wxRegEx::Replace(wxString* text, const wxString& replacement, size_t maxMatches = 0) const 允许你指定要进行多少次替换。为 maxMatches 传递 0 或省略它与 ReplaceAll() 相同。将其设置为 1 与 ReplaceFirst() 相同。传递大于 1 的数字以仅替换前 maxMatches 个匹配。如果 text 包含的匹配少于你要求的,则所有匹配都将被替换,而不会触发错误。

所有三个调用都返回实际进行的替换数。如果正则表达式无法匹配主题文本,则返回零。返回值 -1 表示错误。替换直接进行到你作为第一个参数传递的 wxString。

wxWidgets 使用与 Tcl 相同的语法作为替换文本。你可以使用 \0 作为整个正则表达式匹配项的占位符,并使用 \1\9 作为第一个九个 捕获组 之一匹配的文本。你还可以使用 & 作为 \0 的同义词。请注意,在和号前面没有反斜杠。 & 用整个正则表达式匹配项替换,而 \& 用一个字面和号替换。使用 \\ 插入一个字面反斜杠。你只需要转义反斜杠,如果它们后面跟着一个数字,以防止组合被视为反向引用。在 C++ 代码中将替换文本指定为一个字面字符串时,你需要将所有反斜杠加倍,因为 C++ 编译器也将反斜杠视为转义字符。因此,如果你想用第一个反向引用替换匹配项,后面跟着文本 &co,你需要在 C++ 中将其编码为 _T("\\1\\&co")

| 快速入门 | 教程 | 工具和语言 | 示例 | 参考 | 书籍评论 |

| 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 |