PHPにpreg_replace_callbackという関数があります。
正規表現検索を行い、コールバック関数を使用して置換を行う
http://php.net/manual/ja/function.preg-replace-callback.php
というものです。
これをC#でやるときは、
System.Text.RegularExpressions.Regex.Replace メソッド (String, String, MatchEvaluator)
http://msdn.microsoft.com/ja-jp/library/ht1sxswy.aspx
を利用します。
第1引数が入力文字列で、
第2引数が検索のための正規表現文字列です。
第3引数のMatchEvaluatorデリゲートの中でマッチした部分文字列に対して置換処理を行います。
preg_replace_callbackのマニュアルページの例2にあるサンプルコードをcsで表すとすると以下のようになります。
参考までにPHP側のコードを冒頭にコメントで乗っけています
Regex.Replaceメソッドの使い方のほんの一例です(そもそもreplaceメソッドのオーバーロードの一つでしかない。
ので、詳細は上記MSDNで確認してください。
// <?php
//// このテキストは 2002 に使われていたものなのですが、
//// これを 2003 年対応の日付に変更したいのです
//$text = "エイプリルフールの日付は 04/01/2002 ですn";
//$text.= "この前のクリスマスの日付は 12/24/2001 でしたn";
//// コールバック関数
//function next_year($matches)
//{
// // 通常は、$matches[0] がマッチした全体を表します。
// // $matches[1] は、マッチした中で、パターン内の最初の '(...)'
// // にあてはまる部分を表します。それ以降も同様です。
// return $matches[1].($matches[2]+1);
//}
//echo preg_replace_callback(
// "|(d{2}/d{2}/)(d{4})|",
// "next_year",
// $text);
//?>
var text = @"エイプリルフールの日付は 04/01/2002 です
この前のクリスマスの日付は 12/24/2001 でした";
var replacedText = Regex.Replace(
text,
@"(d{2}/d{2}/)(d{4})",
//x.Valueおよびx.Groups[0]で部分文字列全体
//x.Groups[1以降]は上記席表現の()で括られた部分にあたる部分文字列
x =>
{
return x.Groups[1].Value + (Convert.ToInt32(x.Groups[2].Value) + 1);
});
Console.WriteLine(replacedText);
余談ですが、VS2013を使って、debug中にunhandledな例外が発生した時ローカル変数用のウォッチウィンドウに$exceptionという名前で例外情報が表示されるのが地味に良いと思いました。