2010-04-06 34 views
34

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. Así que mi cadena de entrada se vería así: 23 * x * y * 34 * x * 2.¿Cómo funciona MatchEvaluator en Regex.Replace?

Esta es la expresión regular que hace el trabajo: @"\d(?=[a-z])|[a-z](?=\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 de cómo hacer el mismo trabajo usando .net MatchEvaluator? Soy nuevo en Regex y no entiendo bien reemplazando con MatchEvaluator. Este es el código que he intentado escribió:

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

Respuesta

49

Un MatchEvaluator es un delegado que toma un objeto de ajuste y devuelve una cadena que se debe sustituir en lugar del partido. También puede referirse a grupos del partido. Puede volver a escribir el 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 el delegado se llama, el parámetro de ajuste será un partido en la cadena "3". El delegado en este caso se define para devolver la coincidencia en sí misma como una cadena concatenada con " * ". Por lo tanto, 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.

+0

thx, entiendo – dontoo

+2

Me gustaría mencionar que desde la adición de las expresiones lambda 'delegate (Match m) {return m.Value +" * "; } 'puede ser reemplazado por' (Match m) => return m.Value + "*"; '. Yay progreso. – Pharap

+8

^que se puede simplificar aún más simplemente como '(m) => m.Value +" * "' – m1kael

Cuestiones relacionadas