2010-04-06 12 views
34

To jest łańcuch wejściowy 23x * y34x2. Chcę wstawić " * " (gwiazdka otoczona białymi znakami) po każdej cyfrze, po której następuje litera, a po każdej literze, po której następuje liczba. Mój ciąg wejściowy będzie wyglądał następująco: 23 * x * y * 34 * x * 2.Jak działa MatchEvaluator w Regex.Replace?

To jest wyrażenie regularne, które wykonuje zadanie: @"\d(?=[a-z])|[a-z](?=\d)". Jest to funkcja, którą napisałem, która wstawia " * ".

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 

Moje pytanie, jak wykonać tę samą pracę za pomocą .net MatchEvaluator? Jestem nowy, aby wyrejestrować się i nie rozumiem, że dobrze zastąpić MatchEvaluator. Jest to kod, który próbowałem napisał:

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

Odpowiedz

49

MatchEvaluator jest delegatem że trwa obiekt meczów i zwraca ciąg znaków, który należy wymienić zamiast meczu. Możesz również odnieść się do grup z meczu. Można przepisać kod następująco:

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

Aby dać przykład, jak to działa, po raz pierwszy delegat nazywa, parametr Mecz odbędzie się mecz na strunie "3". Delegat w tym przypadku jest zdefiniowany tak, aby zwracał samo dopasowanie jako ciąg połączony z " * ". Tak więc pierwszy "3" zostaje zastąpiony przez "3 * ".

Proces jest kontynuowany w ten sposób, przy czym delegat jest wywoływany raz dla każdego dopasowania w oryginalnym łańcuchu.

+0

thx, rozumiem – dontoo

+2

Chciałbym wspomnieć, że od dodania wyrażenia lambda 'delegate (Dopasuj m) {return m.Value +" * "; } 'można zastąpić przez' (Dopasuj m) => return m.Value + "*"; '. Yay postęp. – Pharap

+8

^które można jeszcze bardziej uprościć jako '' (m) => m.Value + "*" ' – m1kael

Powiązane problemy