各パターンを固定文字列に置き換えると、それが行わRegex.replace
れます。一致を繰り返す必要はありません。
Regex.Replace(myString, myPattern, "replacement");
そうではなく、置換が一致した値に依存する場合は、MatchEvaluator
デリゲートを の 3 番目の引数として使用し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());
一致にネストされたインスタンスが含まれていないことに注意してください。その場合、別の一致内にある一致を削除するか、正規表現パターンを再実行して、置換ごとに新しい一致を生成する必要があります。私は引き続き、デリゲートを使用する 2 番目のアプローチをお勧めします。