Match.NextMatch Metoda
Definicja
Ważne
Niektóre informacje odnoszą się do produktu w wersji wstępnej, który może zostać znacząco zmodyfikowany przed wydaniem. Firma Microsoft nie udziela żadnych gwarancji, jawnych lub domniemanych, w odniesieniu do informacji podanych w tym miejscu.
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 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.