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