System.Text.RegularExpressions.Regex.Match 方法
本文提供了此 API 参考文档的补充说明。
该方法 Match(String, Int32) 返回与正则表达式模式匹配的第一个子字符串,从输入字符串中的字符位置开始或之后 startat
。 方法搜索的正则表达式模式 Match(String, Int32) 由对类构造函数之一的 Regex 调用定义。 有关用于生成正则表达式模式的语言元素的信息,请参阅 正则表达式语言 - 快速参考。
参数startat
可以选择使用 startat
参数在字符串中指定起始位置。 在字符串中之前 startat
开始的任何匹配项将被忽略。 如果未指定起始位置,则搜索从默认位置开始,这是从左到右搜索的左端 input
,从右到左搜索的右端 input
。 尽管从头开始 startat
,但返回的任何匹配项的索引相对于字符串的开头。
尽管正则表达式引擎不返回从之前 startat
开始的任何匹配项,但它不会在前面 startat
忽略字符串。 这意味着定位点或外观隐藏断言等断言仍应用于整个输入。 例如,以下代码包含一个模式,该模式包含一个外观隐藏断言,即使它在输入字符串中的 5 索引之前 startat
发生。
using System;
using System.Text.RegularExpressions;
namespace Examples
{
public class Example3
{
public static void Main()
{
string input = "Zip code: 98052";
var regex = new Regex(@"(?<=Zip code: )\d{5}");
Match match = regex.Match(input, 5);
if (match.Success)
Console.WriteLine("Match found: {0}", match.Value);
}
}
}
// This code prints the following output:
// Match found: 98052
提示
- 如果模式以定位点开头
^
,但startat
大于 0,则不会在单行搜索中找到任何匹配项,因为它们受^
索引 0 的限制。 \G
定位点在startat
. 因此,如果要限制匹配项,以便它从字符串中的特定字符位置开始,请在左侧定位\G
正则表达式,以使用从左到右模式的正则表达式。 这会限制匹配,使其必须完全从startat
(或,当需要多个匹配项时)开始,因此匹配项是连续的。
从右到左的搜索
从右到左的搜索,即使用选项构造 RegexOptions.RightToLeft 正则表达式模式时,其行为方式如下:
- 扫描方向相反,模式从后部(右)匹配到前方(左)。
- 默认起始位置是输入字符串的右端。
- 如果
startat
指定,则从右到左扫描从字符开始startat
-1(而不是startat
)。 - 当
\G
定位点在模式的右端指定时,它会将 (first) 匹配限制为完全以startat
- 1 结尾。
有关从右向左搜索的详细信息,请参阅 从右向左模式。
确定是否找到匹配项
可以通过检查返回Match对象的Success属性值来确定在输入字符串中找到正则表达式模式。 如果找到匹配项,则Match返回对象的属性包含与input
正则表达式模式匹配的Value子字符串。 如果未找到匹配项,则其值为 String.Empty.
第一个或多个匹配项
此方法返回与正则表达式模式匹配的 startat
字符位置 input
或之后找到的第一个子字符串。 可以通过重复调用返回 Match 对象的 Match.NextMatch 方法来检索后续匹配项。 还可以通过调用 Regex.Matches(String, Int32) 该方法来检索单个方法调用中的所有匹配项。
超时异常
RegexMatchTimeoutException如果匹配操作的执行时间超过构造函数指定的Regex.Regex(String, RegexOptions, TimeSpan)超时间隔,则会引发异常。 如果在调用构造函数时未设置超时间隔,则如果操作超出了为在其中创建对象的应用程序域 Regex 建立的任何超时值,则会引发异常。 如果在构造函数调用或应用程序域的属性中 Regex 未定义超时,或者超时值未 Regex.InfiniteMatchTimeout定义,则不会引发异常。