2010-04-06 11 views
34

Questa è la stringa di input 23x * y34x2. Voglio inserire " * " (stella circondata da spazi bianchi) dopo ogni numero seguito da una lettera e dopo ogni lettera seguita da un numero. Quindi la mia stringa di input sarebbe simile a questa: 23 * x * y * 34 * x * 2.Come funziona MatchEvaluator in Regex.Replace?

Questa è la regex che esegue il lavoro: @"\d(?=[a-z])|[a-z](?=\d)". Questa è la funzione che ho scritto che inserisce lo " * ".

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 

La mia domanda come fare lo stesso lavoro utilizzando .net MatchEvaluator? Sono nuovo di regex e non capisco la buona sostituzione con MatchEvaluator. Questo è il codice che ho cercato di scritto:

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

risposta

49

Un MatchEvaluator è un delegato che prende un oggetto Match e restituisce una stringa che dovrebbe essere sostituito al posto della partita. Puoi anche fare riferimento ai gruppi della partita. È possibile riscrivere il codice come segue:

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

Per dare un esempio di come funziona, la prima volta che il delegato è chiamato, il parametro match sarà una partita sulla corda "3". Il delegato in questo caso è definito per restituire la corrispondenza stessa come una stringa concatenata con " * ". Quindi il primo "3" viene sostituito con "3 * ".

Il processo continua in questo modo, con il delegato chiamato una volta per ogni corrispondenza nella stringa originale.

+0

thx, ho capito – dontoo

+2

Mi piacerebbe menzionare che dall'aggiunta delle espressioni lambda 'delegate (Match m) {return m.Value +" * "; } 'può essere sostituito da' (Match m) => return m.Value + "*"; '. Yay progressi. – Pharap

+8

^che può essere ulteriormente semplificato come '(m) => m.Valore +" * "' – m1kael

Problemi correlati