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定义,则不会引发异常。