我使用类似这样的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);
}
答案 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();
}