快速入门
教程
工具和语言
示例
参考
书籍评论
正则表达式工具
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 Feed 和博客
RegexBuddy—The best regex editor and tester for .NET developers!

使用正则表达式与 Microsoft .NET

Microsoft .NET(你可以将其与任何 .NET 编程语言一起使用,例如 C#(C 锐化)或 Visual Basic.NET)对正则表达式有坚实的支持。.NET 的正则表达式风格非常丰富。唯一值得注意的缺少功能是 独占限定符子例程调用

.NET Framework 2.0 到 4.8 版本支持的正则表达式风格没有差异。此风格与任何版本的 .NET Core 支持的风格也没有差异。其中包括最初的 .NET Core 1.0.0 和最新的 .NET 5.0。

.NET Framework 1.x 中的正则表达式风格与更高版本相比有一些差异。.NET Framework 2.0 修复了一些错误。Unicode 类别 \p{Pi}\p{Pf} 不再反转。名称中带有连字符的 Unicode 块现在可以正确处理。.NET 2.0 中添加了一项功能:字符类减法。它的工作方式与 XML Schema 正则表达式 中完全相同。XML Schema 标准首先定义了此功能及其语法。

System.Text.RegularExpressions 概述(使用 VB.NET 语法)

正则表达式类位于 System.Text.RegularExpressions 命名空间中。若要使它们可用,请将 Imports System.Text.RegularExpressions 放在源代码的开头。

使用 Regex 类编译正则表达式。为了提高效率,正则表达式被编译成内部格式。如果您计划重复使用同一正则表达式,请按如下方式构造 Regex 对象:Dim RegexObj as Regex = New Regex("regularexpression")。然后,您可以调用 RegexObj.IsMatch("subject") 检查正则表达式是否与主题字符串匹配。 Regex 允许使用 RegexOptions 类型的可选第二个参数。您可以将 RegexOptions.IgnoreCase 指定为最终参数,以使正则表达式不区分大小写。其他选项包括 IgnorePatternWhitespace(使正则表达式自由间距),RegexOptions.Singleline(使点匹配换行符),RegexOptions.Multiline(使插入符号和美元符号在主题字符串中匹配嵌入式换行符)和 RegexOptions.ExplicitCapture将所有未命名组转换为非捕获组)。

调用 RegexObj.Replace("subject", "replacement") 使用正则表达式对主题字符串执行搜索和替换,用替换字符串替换所有匹配项。在替换字符串中,您可以使用 $& 将整个正则表达式匹配项插入到替换文本中。您可以使用 $1$2$3 等将捕获括号之间匹配的文本插入到替换文本中。使用 $$ 将单个美元符号插入到替换文本中。若要使用紧跟数字 9 的第一个反向引用替换,请使用 ${1}9。如果您键入 $19,并且反向引用少于 19 个,则 $19 将被解释为文本文字,并按原样显示在结果字符串中。若要插入已命名的捕获组中的文本,请使用 ${name}。不当使用 $ 符号可能会产生不良的结果字符串,但绝不会导致引发异常。

RegexObj.Split("Subject") 根据正则表达式匹配拆分主题字符串,返回一个字符串数组。该数组包含正则表达式匹配之间的文本。如果正则表达式包含捕获括号,则由它们匹配的文本也包含在数组中。如果你希望整个正则表达式匹配包含在数组中,只需在实例化RegexObj时将整个正则表达式括在括号中即可。

Regex 类还包含几个静态方法,允许你在不实例化Regex 对象的情况下使用正则表达式。这减少了你必须编写的代码量,并且如果只使用一次或很少重复使用同一正则表达式,则非常合适。请注意,成员重载在Regex 类中被大量使用。所有静态方法都与其他非静态方法具有相同名称(但参数列表不同)。

Regex.IsMatch("subject", "regex") 检查正则表达式是否与主题字符串匹配。 Regex.Replace("subject", "regex", "replacement") 执行搜索和替换。 Regex.Split("subject", "regex") 将主题字符串拆分为如上所述的字符串数组。所有这些方法都接受RegexOptions 类型的可选附加参数,就像构造函数一样。

System.Text.RegularExpressions.Match 类

如果你想要有关正则表达式匹配的更多信息,请调用Regex.Match() 来构造一个Match 对象。如果你实例化了一个Regex 对象,请使用Dim MatchObj as Match = RegexObj.Match("subject")。如果没有,请使用静态版本:Dim MatchObj as Match = Regex.Match("subject", "regex")

无论哪种方式,你都将获得一个Match 类的对象,其中包含有关主题字符串中第一个正则表达式匹配的详细信息。 MatchObj.Success 指示是否确实存在匹配项。如果是,请使用MatchObj.Value 获取匹配项的内容,MatchObj.Length 获取匹配项的长度,以及MatchObj.Index 获取主题字符串中匹配项的开头。匹配项的开头是从 0 开始的,因此它实际上计算了主题字符串中位于匹配项左侧的字符数。

如果正则表达式包含捕获括号,请使用MatchObj.Groups 集合。 MatchObj.Groups.Count 指示捕获括号的数量。该计数包括第 0 组,即整个正则表达式匹配。 MatchObj.Groups(3).Value 获取由第三对括号匹配的文本。 MatchObj.Groups(3).LengthMatchObj.Groups(3).Index 获取由该组匹配的文本的长度及其在主题字符串中的索引,相对于主题字符串的开头。 MatchObj.Groups("name") 获取命名组“name”的详细信息。

若要在同一主题字符串中查找正则表达式的下一个匹配项,请调用MatchObj.NextMatch(),它返回一个新的Match 对象,其中包含第二次匹配尝试的结果。你可以继续调用MatchObj.NextMatch(),直到MatchObj.Success 为 False。

请注意,在调用RegexObj.Match() 后,生成的Match 对象独立于RegexObj。这意味着你可以同时处理由同一Regex 对象创建的多个Match 对象。

正则表达式、文字字符串和反斜杠

在 C# 文字字符串中,以及在 C++ 和许多其他 .NET 语言中,反斜杠是一个转义字符。文字字符串 "\\" 是一个单反斜杠。在正则表达式中,反斜杠也是一个转义字符。正则表达式 \\ 匹配一个单反斜杠。这个正则表达式作为 C# 字符串时,变为 "\\\\"。没错:4 个反斜杠匹配一个。

正则表达式 \w 匹配一个单词字符。作为 C# 字符串,它写为 "\\w"

为了使你的代码更具可读性,你应该使用 C# 原义字符串。在原义字符串中,反斜杠是一个普通字符。这允许你按在 RegexBuddyPowerGREP 等工具中编写它的方式,或按用户在你的应用程序中键入它的方式,在你的 C# 代码中编写正则表达式。当使用 C# 原义字符串时,匹配反斜杠的正则表达式写为 @"\\"。反斜杠在正则表达式中仍然是一个转义字符,所以你仍然需要对其加倍。但加倍比加四倍好。要匹配一个单词字符,使用原义字符串 @"\w"

RegexOptions.ECMAScript

RegexOptions.ECMAScript 传递给 Regex() 构造函数会改变某些正则表达式功能的行为,以遵循 ECMA-262 标准中规定的行为。此标准定义了 ECMAScript 语言,它更广为人知的是 JavaScript。下表比较了规范的 .NET(没有 ECMAScript 选项)和 ECMAScirpt 模式下的 .NET 之间的差异。为了参考,该表还比较了现代浏览器中的 JavaScript 在这些方面的行为。

功能或语法规范的 .NET.NET 在 ECMAScript 模式下JavaScript
RegexOptions.FreeSpacing受支持仅通过 (?x) 受支持不受支持
RegexOptions.SingleLine受支持仅通过 (?s) 受支持不受支持
RegexOptions.ExplicitCapture受支持仅通过 (?n) 受支持不受支持
转义的字母或下划线,不形成正则表达式标记错误文字字母或下划线
转义的数字,不是有效的反向引用错误八进制转义或文字 8 或 9
转义的双位数字,不构成有效的反向引用错误单位数字反向引用和文字数字(如果单位数字反向引用有效);否则单位或双位八进制转义和/或文字 8 和 9
反向引用到非参与组匹配失败零长度匹配
前向引用受支持错误零长度匹配
反向引用到组 0匹配失败零长度匹配语法上不可能
\sUnicodeASCIIUnicode
\dUnicodeASCII
\wUnicodeASCII
\bUnicodeASCII

虽然 RegexOptions.ECMAScript 使 .NET regex 引擎更接近 JavaScript,但 .NET regex 风格和 JavaScript regex 风格之间仍然存在显著差异。在服务器上使用 ASP.NET 和客户端上使用 JavaScript 创建网页时,即使设置 RegexOptions.ECMAScript,也不能假设相同的 regex 在客户端和服务器端以相同方式工作。下表列出了 .NET 和 JavaScript 之间更重要的差异。RegexOptions.ECMAScript 对其中任何一项都没有影响。

该表还比较了适用于 JavaScript 的 XRegExp 库。你可以使用此库使 JavaScript 的 regex 风格更接近 .NET 的风格。

功能或语法.NETXRegExpJavaScript
[^\n][^\n\r\u2028\u2029]
多行模式中的锚点仅将 \n 视为换行符\n\r\u2028\u2029 视为换行符
$(无多行模式)匹配字符串的最末尾匹配 最终换行符之前 和字符串的最末尾
永久字符串开始和结束锚点受支持不受支持
空字符类语法上不可能匹配失败
后向引用不受限制地支持自 ECMAScript 2018 起(不受限制地)支持
模式修饰符任意位置仅在 regex 开始时不受支持
注释受支持不受支持
Unicode 属性类别和块不受支持
命名捕获和反向引用受支持不受支持
平衡组受支持不受支持
条件受支持不受支持

进一步阅读

掌握正则表达式掌握正则表达式》一书不仅解释了您想知道和不想知道的有关正则表达式的一切,包括 .NET 独有的正则表达式功能。它有一章专门介绍 .NET 的 System.Text.RegularExpressions 命名空间,解释了各种 Regex 类,比 Microsoft 的文档好得多,其中有大量 VB.NET 示例代码和一些 C# 代码,展示了更高级的技术。

我关于《掌握正则表达式》一书的评论

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

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