c# - online - regex replace python
¿Cómo funciona MatchEvaluator en Regex.Replace? (1)
Esta es la cadena de entrada 23x * y34x2
. Quiero insertar " * "
(estrella rodeada de espacios en blanco) después de cada número seguido de una letra, y después de cada letra seguida de un número. Entonces mi cadena de entrada se vería así: 23 * x * y * 34 * x * 2
.
Esta es la expresión regular que hace el trabajo: @"/d(?=[az])|[az](?=/d)"
. Esta es la función que escribí que inserta el " * "
.
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
¿Mi pregunta sobre cómo hacer el mismo trabajo usando .net MatchEvaluator
? Soy nuevo en Regex y no entiendo bien el reemplazo con MatchEvaluator
. Este es el código que intenté escribir:
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 es un delegado que toma un objeto Match y devuelve una cadena que debe reemplazarse en lugar de la coincidencia. También puede referirse a grupos del partido. Puedes reescribir tu código de la siguiente manera:
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 + " * ";
});
Para dar un ejemplo de cómo funciona esto, la primera vez que se llama al delegado, el parámetro Match coincidirá en la cadena "3"
. El delegado en este caso se define para devolver la coincidencia en sí misma como una cadena concatenada con " * "
. Entonces, el primer "3"
se reemplaza por "3 * "
.
El proceso continúa de esta manera, y se llama al delegado una vez para cada coincidencia en la cadena original.