2010-04-06 5 views
34

Ceci est la chaîne d'entrée 23x * y34x2. Je veux insérer " * " (étoile entourée d'espaces) après chaque nombre suivi d'une lettre, et après chaque lettre suivie d'un nombre. Donc, ma chaîne d'entrée ressemblerait à ceci: 23 * x * y * 34 * x * 2.Comment fonctionne MatchEvaluator dans Regex.Replace?

Voici la regex 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 à regex et ne comprends pas le bon remplacement avec MatchEvaluator. Voici le code que j'ai essayé de écrit:

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?? 
} 

Répondre

49

Un MatchEvaluator est un délégué qui prend un objet Match et renvoie une chaîne qui devrait être remplacé au lieu du match. 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 un match sur la chaîne "3". Le délégué dans ce cas est défini pour renvoyer le match lui-même sous la forme d'une chaîne concaténée avec " * ". Donc, le premier "3" est remplacé par "3 * ".

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

+0

thx, je comprends – dontoo

+2

Je voudrais mentionner que depuis l'ajout des expressions lambda 'delegate (Match m) {return m.Value +" * "; } 'peut être remplacé par' (Match m) => return m.Value + "*"; '. Yay progrès. – Pharap

+8

^qui peut encore être simplifié comme juste '(m) => m.Value +" * "' – m1kael

Questions connexes