web-dev-qa-db-fra.com

Comment fonctionne MatchEvaluator dans Regex.Replace?

Il s'agit de la chaîne d'entrée 23x * y34x2. Je veux insérer " * " (Étoile entourée d'espaces blancs) après chaque chiffre suivi d'une lettre, et après chaque lettre suivie d'un chiffre. Donc, ma chaîne de sortie ressemblerait à ceci: 23 * x * y * 34 * x * 2.

C'est l'expression régulière qui fait le travail: @"\d(?=[a-z])|[a-z](?=\d)". C'est la fonction que j'ai écrite qui insère le " * ".

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

Ma question comment faire le même travail en utilisant .net MatchEvaluator? Je suis nouveau sur regex et ne comprends pas bien le remplacement par MatchEvaluator. Voici le code que j'ai essayé d'écrire:

{
    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

Un MatchEvaluator est un délégué qui prend un objet Match et renvoie une chaîne qui doit être remplacée à la place de la correspondance. Vous pouvez également vous référer aux groupes du match. Vous pouvez réécrire votre code comme suit:

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 + " * ";
});

Pour donner un exemple de la façon dont cela fonctionne, la première fois que le délégué est appelé, le paramètre Match sera une correspondance sur la chaîne "3". Dans ce cas, le délégué est défini pour renvoyer la correspondance elle-même sous la forme d'une chaîne concaténée avec " * ". Donc, le premier "3" est remplacé par "3 * ".

Le processus se poursuit de cette manière, le délégué étant appelé une fois pour chaque correspondance dans la chaîne d'origine.

66
Mark Byers