Regex.Replaceメソッドでは、別の文字列への置換・正規表現での置換のほか、マッチ箇所を検証して変換するメソッドを使って置換することもできます。 Regex.ReplaceメソッドにMatchEvaluatorデリゲートを指定することで、そのメソッドを呼び出した結果を置換文字列とすることができます。 置換時の動作をメソッドとして細かく規定することができるため、置換の正規表現要素だけでは記述できないような置換を行うことができます。
MatchEvaluatorデリゲートにはマッチ箇所の置換を行うメソッド(Matchクラスを引数にとり、置換後の結果となる文字列を返すメソッド)を指定します。 Replaceメソッドを呼び出してマッチする箇所が見つかると、マッチした箇所に該当するMatchインスタンスがMatchEvaluatorに渡されます。 MatchEvaluatorが返す文字列がマッチ箇所に置換され、Replaceメソッドの結果として返されます。
次の例では、Replaceメソッドを用いて拡張子にあたる部分を探索し、MatchEvaluatorデリゲートによって拡張子部分を".bak"
に置き換えています。
Regex.ReplaceメソッドとMatchEvaluatorを使ってマッチ箇所の文字列を置換する
using System;
using System.Text.RegularExpressions;
class Sample {
// マッチした箇所に置き換える文字列を返すメソッド
static string ChangeExtension(Match m)
{
// 引数mにはRegex.Replaceメソッドの呼び出しでマッチした箇所が設定されている
if (m.Value.EndsWith(".bak"))
// マッチした箇所が".bak"で終わる場合は、そのままにする
return m.Value;
else
// そうでなければ、".bak"を追加する
return m.Value + ".bak";
}
static void Main()
{
var files = new string[] {
"sample.txt",
"sample.txt.bak",
"sample.cs",
"test.txt",
"test.jpeg",
"README",
};
foreach (var file in files) {
Console.Write("{0,-20} => ", file);
// 正規表現にマッチした箇所をメソッドChangeExtensionが返す結果で置換する
var bakFile = Regex.Replace(file, @"\..*", ChangeExtension);
Console.WriteLine(bakFile);
}
}
}
実行結果
sample.txt => sample.txt.bak sample.txt.bak => sample.txt.bak sample.cs => sample.cs.bak test.txt => test.txt.bak test.jpeg => test.jpeg.bak README => README
Regex.Replaceメソッドで置換後の文字列を指定した場合、この文字列は単純な文字列ではなく正規表現として解釈され、$ で始まる正規表現要素を指定することが出来ます。