Match.NextMatch 方法

定义

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

public:
 System::Text::RegularExpressions::Match ^ NextMatch();
public System.Text.RegularExpressions.Match NextMatch ();
member this.NextMatch : unit -> System.Text.RegularExpressions.Match
Public Function NextMatch () As Match

返回

Match

下一个正则表达式匹配。

例外

发生超时。

示例

以下示例使用该方法 NextMatch 捕获超出第一个匹配项的正则表达式匹配项。

#using <System.dll>

using namespace System;
using namespace System::Text::RegularExpressions;
void main()
{
   
   String^ text = "One car red car blue car";
   String^ pat = "(\\w+)\\s+(car)";
   
   // Compile the regular expression.
   Regex^ r = gcnew Regex( pat,RegexOptions::IgnoreCase );
   
   // Match the regular expression pattern against a text string.
   Match^ m = r->Match(text);
   int matchCount = 0;
   while ( m->Success )
   {
      Console::WriteLine( "Match{0}", ++matchCount );
      for ( int i = 1; i <= 2; i++ )
      {
         Group^ g = m->Groups[ i ];
         Console::WriteLine( "Group{0}='{1}'", i, g );
         CaptureCollection^ cc = g->Captures;
         for ( int j = 0; j < cc->Count; j++ )
         {
            Capture^ c = cc[ j ];
            System::Console::WriteLine( "Capture{0}='{1}', Position={2}", j, c, c->Index );
         }
      }
      m = m->NextMatch();
   }
}  
// This example displays the following output:
//       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
using System;
using System.Text.RegularExpressions;

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

      // Instantiate the regular expression object.
      Regex r = new Regex(pat, RegexOptions.IgnoreCase);

      // Match the regular expression pattern against a text string.
      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();
      }
   }
}
// This example displays the following output:
//       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
Imports System.Text.RegularExpressions

Module Example
   Public Sub Main()
      Dim text As String = "One car red car blue car"
      Dim pattern As String = "(\w+)\s+(car)"

      ' Instantiate the regular expression object.
      Dim r As Regex = new Regex(pattern, RegexOptions.IgnoreCase)

      ' Match the regular expression pattern against a text string.
      Dim m As Match = r.Match(text)
      Dim matchcount as Integer = 0
      Do While m.Success
         matchCount += 1
         Console.WriteLine("Match" & (matchCount))
         Dim i As Integer
         For i = 1 to 2
            Dim g as Group = m.Groups(i)
            Console.WriteLine("Group" & i & "='" & g.ToString() & "'")
            Dim cc As CaptureCollection = g.Captures
            Dim j As Integer 
            For j = 0 to cc.Count - 1
              Dim c As Capture = cc(j)
               Console.WriteLine("Capture" & j & "='" & c.ToString() _
                  & "', Position=" & c.Index)
            Next 
         Next 
         m = m.NextMatch()
      Loop
   End Sub
End Module
' This example displays the following output:
'       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 超时值。

调用方说明

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

下面的示例进行了这方面的演示。 正则表达式模式 a* 在字符串“abaabb”中搜索字母“a”的零个或多个匹配项。 如示例中的输出所示,搜索将找到六个匹配项。 第一次匹配尝试查找第一个“a”。 第二个匹配开始完全在第一个 b 之前第一个匹配结束的位置:它查找“a”的零次,并返回空字符串。 第三个匹配不会完全开始第二个匹配项结束的位置,因为第二个匹配返回了空字符串。 相反,它会稍后在第一个“b”后面开始一个字符。 第三个匹配项查找“a”的两个匹配项,并返回“aa”。 第四次匹配尝试开始,第三个匹配项在第二个“b”之前结束,并返回一个空字符串。 第五次匹配尝试会再次推进一个字符,以便在第三个“b”之前开始,并返回一个空字符串。 第六场比赛在最后一个“b”之后开始,并再次返回一个空字符串。

:::code language=“csharp” source=“~/snippets/csharp/System.Text.RegularExpressions/Match/NextMatch/nextmatch1.cs” interactive=“try-dotnet” id=“Snippet1”::: ::code language=“vb” source=“~/snippets/visualbasic/VS_Snippets_CLR_System/system.text.regularexpressions.match.nextmatch/vb/nextmatch1.vb” id=“Snippet1”::

适用于