正则表达式工具 |
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 和博客 |
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 命名空间中。若要使它们可用,请将 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 类型的可选附加参数,就像构造函数一样。
如果你想要有关正则表达式匹配的更多信息,请调用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).Length 和MatchObj.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# 原义字符串。在原义字符串中,反斜杠是一个普通字符。这允许你按在 RegexBuddy 或 PowerGREP 等工具中编写它的方式,或按用户在你的应用程序中键入它的方式,在你的 C# 代码中编写正则表达式。当使用 C# 原义字符串时,匹配反斜杠的正则表达式写为 @"\\"。反斜杠在正则表达式中仍然是一个转义字符,所以你仍然需要对其加倍。但加倍比加四倍好。要匹配一个单词字符,使用原义字符串 @"\w"。
将 RegexOptions.ECMAScript 传递给 Regex() 构造函数会改变某些正则表达式功能的行为,以遵循 ECMA-262 标准中规定的行为。此标准定义了 ECMAScript 语言,它更广为人知的是 JavaScript。下表比较了规范的 .NET(没有 ECMAScript 选项)和 ECMAScirpt 模式下的 .NET 之间的差异。为了参考,该表还比较了现代浏览器中的 JavaScript 在这些方面的行为。
功能或语法 | 规范的 .NET | .NET 在 ECMAScript 模式下 | JavaScript |
---|---|---|---|
RegexOptions.FreeSpacing | 受支持 | 仅通过 | 受支持不受支持 |
RegexOptions.SingleLine | 受支持 | 仅通过 | 受支持不受支持 |
RegexOptions.ExplicitCapture | 受支持 | 仅通过 | 受支持不受支持 |
转义的字母或下划线,不形成正则表达式标记 | 错误 | 文字字母或下划线 | |
转义的数字,不是有效的反向引用 | 错误 | 八进制转义或文字 8 或 9 | |
转义的双位数字,不构成有效的反向引用 | 错误 | 单位数字反向引用和文字数字(如果单位数字反向引用有效);否则单位或双位八进制转义和/或文字 8 和 9 | |
反向引用到非参与组 | 匹配失败 | 零长度匹配 | |
前向引用 | 受支持 | 错误 | 零长度匹配 |
反向引用到组 0 | 匹配失败 | 零长度匹配 | 语法上不可能 |
\s | Unicode | ASCII | Unicode |
\d | Unicode | ASCII | |
\w | Unicode | ASCII | |
\b | Unicode | ASCII |
虽然 RegexOptions.ECMAScript 使 .NET regex 引擎更接近 JavaScript,但 .NET regex 风格和 JavaScript regex 风格之间仍然存在显著差异。在服务器上使用 ASP.NET 和客户端上使用 JavaScript 创建网页时,即使设置 RegexOptions.ECMAScript,也不能假设相同的 regex 在客户端和服务器端以相同方式工作。下表列出了 .NET 和 JavaScript 之间更重要的差异。RegexOptions.ECMAScript 对其中任何一项都没有影响。
该表还比较了适用于 JavaScript 的 XRegExp 库。你可以使用此库使 JavaScript 的 regex 风格更接近 .NET 的风格。
功能或语法 | .NET | XRegExp | JavaScript |
---|---|---|---|
点 | [^\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 |
页面 URL:https://regexper.cn/dotnet.html
页面上次更新时间:2021 年 8 月 24 日
网站上次更新时间:2024 年 3 月 15 日
版权所有 © 2003-2024 Jan Goyvaerts。保留所有权利。