如果你用一个固定的字符串替换每个模式Regex.replace
,为你做这件事。您不需要迭代匹配项:
Regex.Replace(myString, myPattern, "replacement");
否则,如果替换依赖于匹配的值,则使用MatchEvaluator
委托作为 的第三个参数Regex.Replace
。它接收一个实例Match
并返回string
。返回值是替换字符串。如果您不想替换某些匹配项,只需返回match.Value
:
string myString = "aa bb aa bb";
string myPattern = @"\w+";
string result = Regex.Replace(myString, myPattern,
match => match.Value == "aa" ? "0" : "1" );
Console.WriteLine(result);
// 0 1 0 1
如果您确实需要迭代匹配并手动替换它们,则需要从最后一个匹配开始替换到第一个匹配,这样字符串的索引就不会为即将到来的匹配而破坏。这是一个例子:
var matches = Regex.Matches(myString, myPattern);
var matchesFromEndToStart = matches.Cast<Match>().OrderByDescending(m => m.Index);
var sb = new StringBuilder(myString);
foreach (var match in matchesFromEndToStart)
{
if (IsGood(match))
{
sb.Remove(match.Index, match.Length)
.Insert(match.Index, GetReplacementFor(match));
}
}
Console.WriteLine(sb.ToString());
请注意,您的匹配项不包含嵌套实例。如果是这样,您要么需要删除另一个匹配项中的匹配项,要么在每次替换后重新运行正则表达式模式以生成新匹配项。我仍然推荐第二种方法,它使用代表。