Freigeben über


Match.NextMatch Methode

Definition

Gibt ein neues Match-Objekt mit den Ergebnissen für die nächste Übereinstimmung zurück und beginnt dabei an der Endposition der vorherigen Übereinstimmung (mit dem Zeichen, das dem letzten übereinstimmenden Zeichen folgt).

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

Gibt zurück

Die folgende Übereinstimmung für einen regulären Ausdruck.

Ausnahmen

Es ist ein Timeout aufgetreten.

Beispiele

Im folgenden Beispiel wird die NextMatch -Methode verwendet, um Übereinstimmungen mit regulären Ausdrücken über die erste Übereinstimmung hinaus zu erfassen.

#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

Hinweise

Diese Methode ähnelt dem erneuten Aufrufen Regex.Match(String, Int32) und Übergeben von (Index+Length) als neue Startposition.

Hinweis

Diese Methode ändert die aktuelle Instanz nicht. Stattdessen wird ein neues Match -Objekt zurückgegeben, das Informationen zur nächsten Übereinstimmung enthält.

Beim Versuch, die nächste Übereinstimmung abzurufen, wird möglicherweise ein RegexMatchTimeoutException ausgelöst, wenn ein Timeoutwert für Abgleichsvorgänge wirksam ist und der Versuch, die nächste Übereinstimmung zu finden, dieses Timeoutintervall überschreitet.

Hinweise für Aufrufer

Wenn ein Übereinstimmungsversuch durch Aufrufen der NextMatch() -Methode wiederholt wird, gibt die Engine für reguläre Ausdrücke eine Sonderbehandlung für leere Übereinstimmungen. In der Regel beginnt die Suche nach der nächsten Übereinstimmung genau dort, NextMatch() wo die vorherige Übereinstimmung aufgehört hat. Nach einer leeren Übereinstimmung wird die NextMatch() Methode jedoch um ein Zeichen erweitert, bevor sie die nächste Übereinstimmung versucht. Dieses Verhalten garantiert, dass die Engine für reguläre Ausdrücke die Zeichenfolge durchläuft. Da eine leere Übereinstimmung andernfalls keine Vorwärtsbewegung zur Folge hat, würde die nächste Übereinstimmung genau an derselben Stelle wie die vorherige Übereinstimmung beginnen und wiederholt mit derselben leeren Zeichenfolge übereinstimmen.

Dies wird im folgenden Beispiel veranschaulicht. Das Muster a* für reguläre Ausdrücke sucht nach null oder mehr Vorkommen des Buchstabens "a" in der Zeichenfolge "abaabb". Wie die Ausgabe des Beispiels zeigt, findet die Suche sechs Übereinstimmungen. Beim ersten Übereinstimmungsversuch wird das erste "a" gefunden. Die zweite Übereinstimmung beginnt genau dort, wo die erste Übereinstimmung endet, vor der ersten b; Es findet null Vorkommen von "a" und gibt eine leere Zeichenfolge zurück. Die dritte Übereinstimmung beginnt nicht genau dort, wo die zweite Übereinstimmung endete, da die zweite Übereinstimmung eine leere Zeichenfolge zurückgegeben hat. Stattdessen beginnt es ein Zeichen später, nach dem ersten "b". Die dritte Übereinstimmung findet zwei Vorkommen von "a" und gibt "aa" zurück. Der vierte Übereinstimmungsversuch beginnt dort, wo die dritte Übereinstimmung vor dem zweiten "b" endete, und gibt eine leere Zeichenfolge zurück. Beim fünften Übereinstimmungsversuch wird erneut ein Zeichen so erweitert, dass es vor dem dritten "b" beginnt und eine leere Zeichenfolge zurückgibt. Die sechste Übereinstimmung beginnt nach dem letzten "b" und gibt erneut eine leere Zeichenfolge zurück.

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.

Gilt für: