设置正则表达式匹配器的索引

时间:2015-12-10 14:43:08

标签: .net regex

我使用类似这样的foreach循环在.NET应用程序中迭代Regex匹配:

foreach(Match m in Regex.Matches(input, pattern, options))
{
    if(SomeNonRegExCondition(m))
        continue; // no match

    ProcessMatch(m);
}

不幸的是,如果SomeNonRegExCondition(m)true,则模式匹配太多,我想继续在pattern而不是m.Index + 1应用m.Index + m.Value.Length。 .NET可以选择这样做吗?

我不确定附加的MVCE带来了什么,但是,它已被要求:

// consider this a sample pattern and a sample condition
// changing the pattern to not match in the first place is no option for me
const string input = "(abc)abcxyz";
const string pattern = "ab.*yz";

foreach(Match match in Regex.Matches(input, pattern))
{
  if ( /* some random condition, for MVCE using: */ match.Index == 1)
  {
    // Question: How to reset regex matcher in a way that it matches "abcxyz" at index 5
    continue;
  }

  Console.WriteLine (match);
}

1 个答案:

答案 0 :(得分:1)

稍微改变方法,而不是使用.Matches查找所有匹配项,而是使用.Match查找第一个匹配项,并使用.NextMatch迭代它们。

这样,在您的情况下,您可以通过使用您必须到达的子字符串的另一个.Match调用再次启动匹配过程来完全更改匹配对象:

const string input = "(abc)abcxyz";
const string pattern = "ab.*yz";

var match = Regex.Match(input, pattern);

while(match.Success) {
    if ( /* some random condition, for MVCE using: */ match.Index == 1)
    {
        //Start the matching process again at the next character, using Substring
        match = Regex.Match(input.Substring(match.Index+1), pattern);
        continue;
    }

    Console.Write(match); //abcxyz

    match = match.NextMatch();
}