Match.NextMatch 方法
定义
重要
一些信息与预发行产品相关,相应产品在发行之前可能会进行重大修改。 对于此处提供的信息,Microsoft 不作任何明示或暗示的担保。
从上一个匹配结束的位置(即在上一个匹配字符之后的字符)开始返回一个包含下一个匹配结果的新 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
返回
下一个正则表达式匹配。
例外
示例
以下示例使用该方法 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”::