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

Match

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 zgłosić RegexMatchTimeoutException wartość limitu czasu dla pasujących operacji, a próba znalezienia następnego dopasowania przekracza ten interwał 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 zostało przerwane poprzednie dopasowanie. 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ępne dopasowanie rozpocznie się dokładnie w tym samym miejscu co poprzednie dopasowanie i będzie pasować do tego samego pustego ciągu wielokrotnie.

Poniższy przykład stanowi ilustrację. Wzorzec wyrażenia regularnego a* wyszukuje zero lub więcej wystąpień litery "a" w ciągu "abaabb". Jak pokazano w danych wyjściowych z przykładu, wyszukiwanie znajdzie 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ż drugie dopasowanie zwróciło pusty ciąg. Zamiast tego rozpoczyna się jeden znak później, po pierwszym znaku "b". Trzecie dopasowanie znajduje dwa wystąpienia "a" i zwraca wartość "aa". Czwarta próba dopasowania rozpoczyna się w miejscu, w którym 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 ciągu "b" i ponownie zwraca pusty ciąg.

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.

Dotyczy