本文提供了此 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: {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
定位点指定在模式的右端时,它会将首次匹配限制为精确地以startat
- 1结尾。
有关从右向左搜索的详细信息,请参阅 从右向左模式。
确定是否找到匹配项
可以通过检查返回 Match 对象的 Success 属性值来确定在输入字符串中找到正则表达式模式。 如果找到匹配项,则Match返回对象的属性包含与Value正则表达式模式匹配的input
子字符串。 如果未找到匹配项,则其值为 String.Empty.
首个或多个匹配项
此方法返回与正则表达式模式匹配的 startat
中 input
字符位置或之后找到的第一个子字符串。 可以通过重复调用返回 Match 对象的 Match.NextMatch 方法来检索后续匹配项。 还可以通过调用 Regex.Matches(String, Int32) 该方法来检索单个方法调用中的所有匹配项。
超时异常
如果匹配操作的执行时间超过 RegexMatchTimeoutException 构造函数指定的超时间隔,则会引发 Regex.Regex(String, RegexOptions, TimeSpan) 异常。 如果在调用构造函数时未设置超时间隔,当在创建 Regex 对象的应用程序域中操作超过任何已建立的超时值时,将会引发异常。 如果在构造函数调用或应用程序域的属性中未定义 Regex 超时,或者超时值为 Regex.InfiniteMatchTimeout,则不会引发异常。