正则表达式工具 |
grep |
语言和函数库 |
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 |
更多内容 |
简介 |
正则表达式快速入门 |
正则表达式教程 |
替换字符串教程 |
应用程序和语言 |
正则表达式范例 |
正则表达式参考 |
替换字符串参考 |
使用正则表达式与 Microsoft .NET
Microsoft .NET,您可以使用任何 .NET 编程语言,例如 C# (C sharp) 或 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 语法)
regex 类别位于命名空间 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).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# 原文本串。在原文本串中,反斜线是一个普通字符。这允许你用你会在正则表达式工具中写的方式,或用户会在你的应用程序中输入的方式,来在你的 C# 代码中撰写正则表达式。在使用 C# 原文本串时,符合反斜线的正则表达式写成 @"\\"
。反斜线在正则表达式中仍然是一个转义字符,所以你仍然需要将它加倍。但是加倍比加四倍好。若要符合一个字符,请使用原文本串 @"\w"
。
RegexOptions.ECMAScript
传递 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 属性 | 类别和区块 | 不支持 | |
命名截取和反向引用 | 支持 | 不支持 | |
平衡组 | 支持 | 不支持 | |
条件 | 支持 | 不支持 |