53

これは入力文字列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??
}
4

1 に答える 1

77

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回呼び出されます。

于 2010-04-06T20:16:49.163 に答える