web-dev-qa-db-ja.com

Regex.ReplaceのMatchEvaluatorはどのように機能しますか?

これは入力文字列_23x * y34x2_です。すべての数字の後に文字が続き、すべての文字の後に数字が続く後に_" * "_(空白で囲まれた星)を挿入したいと思います。したがって、出力文字列は次のようになります:_23 * x * y * 34 * x * 2_。

これは、ジョブを実行する正規表現@"\d(?=[a-z])|[a-z](?=\d)"です。これは、私が書いた_" * "_を挿入する関数です。

_Regex reg = new Regex(@"\d(?=[a-z])|[a-z](?=\d)");   
MatchCollection matchC;
matchC = reg.Matches(input);
int ii = 1;
foreach (Match element in matchC)//foreach match I will find the index of that match
{
    input = input.Insert(element.Index + ii, " * ");//since I' am inserting " * " ( 3 characters )
    ii += 3;                                        //I must increment index by 3
}
return input; //return modified input
_

.net MatchEvaluatorを使用して同じ仕事をするにはどうすればよいですか?私は正規表現に不慣れで、MatchEvaluatorに置き換えるのがよくわかりません。これは私が書こうとしたコードです:

_{
    Regex reg = new Regex(@"\d(?=[a-z])|[a-z](?=\d)");
    MatchEvaluator matchEval = new MatchEvaluator(ReplaceStar);
    input = reg.Replace(input, matchEval);
    return input;
}
public string ReplaceStar( Match match )
{
    //return What??
}
_
44
dontoo

MatchEvaluator は、Matchオブジェクトを受け取り、一致の代わりに置き換える必要がある文字列を返すデリゲートです。試合からグループを参照することもできます。次のようにコードを書き直すことができます。

string input = "23x * y34x2";
Regex reg = new Regex(@"\d(?=[a-z])|[a-z](?=\d)");
string result = reg.Replace(input, delegate(Match m) {
    return m.Value + " * ";
});

これがどのように機能するかの例を示すために、デリゲートが最初に呼び出されたときに、Matchパラメーターは文字列"3"の一致になります。この場合のデリゲートは、" * "で連結された文字列として一致自体を返すように定義されています。したがって、最初の"3""3 * "に置き換えられます。

このプロセスはこのように続行され、元の文字列の一致ごとにデリゲートが1回呼び出されます。

66
Mark Byers