Match.NextMatch Metoda

Definicja

Zwraca nowy Match obiekt z wynikami następnego dopasowania, zaczynając od pozycji, w której zakończyło się ostatnie dopasowanie (w znaku po ostatnim dopasowanym znaku).

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

Zwraca

Następne wyrażenie regularne jest zgodne.

Wyjątki

Wystąpił limit czasu.

Przykłady

W poniższym przykładzie użyto NextMatch metody do przechwytywania dopasowań wyrażeń regularnych poza pierwszym dopasowaniem.

#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

Uwagi

Ta metoda jest podobna do wywoływania Regex.Match(String, Int32) ponownie i przekazywania (Index+Length) jako nowej pozycji początkowej.

Uwaga

Ta metoda nie modyfikuje bieżącego wystąpienia. Zamiast tego zwraca nowy Match obiekt zawierający informacje o następnym dopasowaniu.

Próba pobrania następnego dopasowania może spowodować wyrzucenie RegexMatchTimeoutException wartości limitu czasu dla pasujących operacji i próba znalezienia następnego dopasowania przekracza ten interwał przekroczenia limitu czasu.

Uwagi dotyczące wywoływania

Gdy próba dopasowania jest powtarzana przez wywołanie NextMatch() metody, aparat wyrażeń regularnych daje puste dopasowania specjalne. Zazwyczaj rozpoczyna wyszukiwanie następnego dopasowania dokładnie tam, NextMatch() gdzie poprzedni mecz został przerwany. Jednak po pustym dopasowaniu NextMatch() metoda przechodzi przez jeden znak przed próbą następnego dopasowania. To zachowanie gwarantuje, że aparat wyrażeń regularnych będzie przechodził przez ciąg. W przeciwnym razie, ponieważ puste dopasowanie nie powoduje żadnego ruchu do przodu, następny mecz rozpocznie się dokładnie w tym samym miejscu co poprzedni mecz i będzie pasował do tego samego pustego ciągu wielokrotnie.

Poniższy przykład stanowi ilustrację. Wzorzec a* wyrażenia regularnego wyszukuje zero lub więcej wystąpień litery "a" w ciągu "abaabb". Jak pokazuje dane wyjściowe z przykładu, wyszukiwanie znajduje sześć dopasowań. Pierwsza próba dopasowania znajduje pierwszy "a". Drugi mecz rozpoczyna się dokładnie tam, gdzie kończy się pierwszy mecz, przed pierwszym b; znajduje zero wystąpień "a" i zwraca pusty ciąg. Trzecie dopasowanie nie rozpoczyna się dokładnie tam, gdzie zakończyło się drugie dopasowanie, ponieważ drugi mecz zwrócił pusty ciąg. Zamiast tego zaczyna się jeden znak później, po pierwszym "b". Trzeci mecz znajduje dwa wystąpienia "a" i zwraca wartość "aa". Czwarta próba meczu rozpoczyna się, gdzie zakończyło się trzecie dopasowanie, przed drugim "b" i zwraca pusty ciąg. Piąta próba dopasowania ponownie przechodzi jeden znak, tak aby rozpoczynał się przed trzecim "b" i zwraca pusty ciąg. Szósty mecz rozpoczyna się po ostatnim "b" i zwraca pusty ciąg ponownie.

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();
      }
   }
}
// The example displays the following output:
//       '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.
Imports System.Text.RegularExpressions

Module Example
   Public Sub Main()
      Dim pattern As String = "a*"
      Dim input As String = "abaabb"
      
      Dim m As Match = Regex.Match(input, pattern)
      Do While m.Success
         Console.WriteLine("'{0}' found at index {1}.", 
                           m.Value, m.Index)
         m = m.NextMatch()
      Loop         
   End Sub
End Module
' The example displays the following output:
'       '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.

Dotyczy