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: {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.

首个或多个匹配项

此方法返回与正则表达式模式匹配的 startatinput 字符位置或之后找到的第一个子字符串。 可以通过重复调用返回 Match 对象的 Match.NextMatch 方法来检索后续匹配项。 还可以通过调用 Regex.Matches(String, Int32) 该方法来检索单个方法调用中的所有匹配项。

超时异常

如果匹配操作的执行时间超过 RegexMatchTimeoutException 构造函数指定的超时间隔,则会引发 Regex.Regex(String, RegexOptions, TimeSpan) 异常。 如果在调用构造函数时未设置超时间隔,当在创建 Regex 对象的应用程序域中操作超过任何已建立的超时值时,将会引发异常。 如果在构造函数调用或应用程序域的属性中未定义 Regex 超时,或者超时值为 Regex.InfiniteMatchTimeout,则不会引发异常。