Match.NextMatch
方法
从上一个匹配结束的位置(即在上一个匹配字符之后的字符)开始返回一个包含下一个匹配结果的新 Match
对象。
public System.Text.RegularExpressions.Match NextMatch ();
Returns
Match
下一个正则表达式匹配。
Exceptions
RegexMatchTimeoutException
发生超时。
示例
下面的示例使用 NextMatch
方法来捕获除第一个匹配项之外的正则表达式匹配项。
using System;
using System.Text.RegularExpressions;
class Example
{
static void Main()
{
string text = "One car red car blue car";
string pat = @"(\w+)\s+(car)";
// 实例化正则表达式对象
Regex r = new Regex(pat, RegexOptions.IgnoreCase);
// 将正则表达式模式与文本字符串匹配
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();
}
}
}
// 本示例显示以下输出:
// 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
。
Notes to Callers
当通过调用 NextMatch()
方法重复匹配尝试时,正则表达式引擎将为空匹配提供特殊处理。 通常,NextMatch()
将从下一个匹配项的确切位置开始搜索下一个匹配项。 但是,在空匹配项后,NextMatch()
方法将前进一个字符,然后再尝试下一个匹配。 此行为保证了正则表达式引擎将遍历字符串。 否则,由于空匹配不会导致任何向前移动,因此下一个匹配项将与上一个匹配项完全相同的位置开始,并且它将重复匹配相同的空字符串。
以下示例提供了一个说明。正则表达式模式a *
在字符串"abaabb"
中搜索零个或多个出现的字母"a"
。如示例的输出所示,搜索找到六个匹配项。第一次匹配尝试将找到第一个"a"
。第二个匹配正好在第一个匹配b
之前的第一个匹配结束的地方开始;查找零个出现的"a"
并返回一个空字符串。第三次匹配并不完全在第二次匹配结束的地方开始,因为第二次匹配返回了一个空字符串。相反,它会在第一个"b"
之后的一个字符之后开始。第三个匹配找到两次出现的"a"
并返回"aa"
。第四个匹配尝试从第二个b
之前的第三个匹配结束的地方开始,并返回一个空字符串。第五次匹配尝试再次使一个字符前进,使其在第三个"b"
之前开始并返回一个空字符串。第六个匹配项在最后一个"b"
之后开始,并再次返回一个空字符串。
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();
}
}
}
// 该示例显示以下输出:
// '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.