Match.NextMatch方法

Match.NextMatch 方法

从上一个匹配结束的位置(即在上一个匹配字符之后的字符)开始返回一个包含下一个匹配结果的新 Match 对象。

public System.Text.RegularExpressions.Match NextMatch ();

Returns

Match
下一个正则表达式匹配。

Exceptions

RegexMatchTimeoutException
发生超时。

示例

下面的示例使用 NextMatch 方法来捕获除第一个匹配项之外的正则表达式匹配项。

using System;
using System.Text.RegularExpressions;

class Example
{
   static void Main()
   {
      string text = "One car red car blue car";
      string pat = @"(\w+)\s+(car)";

      // 实例化正则表达式对象
      Regex r = new Regex(pat, RegexOptions.IgnoreCase);

      // 将正则表达式模式与文本字符串匹配
      Match m = r.Match(text);
      int matchCount = 0;
      while (m.Success)
      {
         Console.WriteLine("Match"+ (++matchCount));
         for (int i = 1; i <= 2; i++)
         {
            Group g = m.Groups[i];
            Console.WriteLine("Group"+i+"='" + g + "'");
            CaptureCollection cc = g.Captures;
            for (int j = 0; j < cc.Count; j++)
            {
               Capture c = cc[j];
               System.Console.WriteLine("Capture"+j+"='" + c + "', Position="+c.Index);
            }
         }
         m = m.NextMatch();
      }
   }
}
// 本示例显示以下输出:
//       Match1
//       Group1='One'
//       Capture0='One', Position=0
//       Group2='car'
//       Capture0='car', Position=4
//       Match2
//       Group1='red'
//       Capture0='red', Position=8
//       Group2='car'
//       Capture0='car', Position=12
//       Match3
//       Group1='blue'
//       Capture0='blue', Position=16
//       Group2='car'
//       Capture0='car', Position=21

备注

此方法类似于再次调用 Regex.Match(String, Int32) 和传递(Index+Length)作为新的起始位置。

备注
此方法不会修改当前实例。 相反,它会返回一个新的 Match 对象,其中包含有关下一个匹配项的信息。

如果匹配操作的超时值有效且尝试查找下一个匹配项超过该超时间隔,尝试检索下一个匹配项可能会引发 RegexMatchTimeoutException

Notes to Callers

当通过调用 NextMatch() 方法重复匹配尝试时,正则表达式引擎将为空匹配提供特殊处理。 通常,NextMatch() 将从下一个匹配项的确切位置开始搜索下一个匹配项。 但是,在空匹配项后,NextMatch() 方法将前进一个字符,然后再尝试下一个匹配。 此行为保证了正则表达式引擎将遍历字符串。 否则,由于空匹配不会导致任何向前移动,因此下一个匹配项将与上一个匹配项完全相同的位置开始,并且它将重复匹配相同的空字符串。

以下示例提供了一个说明。正则表达式模式a *在字符串"abaabb"中搜索零个或多个出现的字母"a"。如示例的输出所示,搜索找到六个匹配项。第一次匹配尝试将找到第一个"a"。第二个匹配正好在第一个匹配b之前的第一个匹配结束的地方开始;查找零个出现的"a"并返回一个空字符串。第三次匹配并不完全在第二次匹配结束的地方开始,因为第二次匹配返回了一个空字符串。相反,它会在第一个"b"之后的一个字符之后开始。第三个匹配找到两次出现的"a"并返回"aa"。第四个匹配尝试从第二个b之前的第三个匹配结束的地方开始,并返回一个空字符串。第五次匹配尝试再次使一个字符前进,使其在第三个"b"之前开始并返回一个空字符串。第六个匹配项在最后一个"b"之后开始,并再次返回一个空字符串。

using System;
using System.Text.RegularExpressions;

public class Example
{
   public static void Main()
   {
      string pattern = "a*";
      string input = "abaabb";
      
      Match m = Regex.Match(input, pattern);
      while (m.Success) {
         Console.WriteLine("'{0}' found at index {1}.", 
                           m.Value, m.Index);
         m = m.NextMatch();
      }
   }
}
// 该示例显示以下输出:
//       'a' found at index 0.
//       '' found at index 1.
//       'aa' found at index 2.
//       '' found at index 4.
//       '' found at index 5.
//       '' found at index 6.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值