2010-04-06 68 views
34

這是輸入字符串23x * y34x2。我想在每個數字後加上一個字母,並在每個字母后跟數字後插入" * "(星號包圍空格)。所以我的輸入字符串看起來像這樣:23 * x * y * 34 * x * 2Regex.Replace中的MatchEvaluator如何工作?

這是執行這項工作的正則表達式:@"\d(?=[a-z])|[a-z](?=\d)"。這是我寫的插入" * "的函數。

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 

我的問題如何使用.net MatchEvaluator做同樣的工作?我剛接觸正則表達式,並不明白替換爲MatchEvaluator。這是我試過的代碼中寫道:

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

回答

49

一個MatchEvaluator是一個委託,需要一個匹配對象,並返回應該被替換,而不是匹配的字符串。你也可以參考比賽中的小組。你可以重寫代碼如下:

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

舉的這個方法工作的例子,第一時間委託被調用時,匹配參數將在字符串"3"匹配。這種情況下的委託被定義爲將匹配本身作爲與" * "連接的字符串返回。所以第一個"3"被替換爲"3 * "

該過程以這種方式繼續,對於原始字符串中的每個匹配調用一次委託。

+0

thx,我明白 – dontoo 2010-04-06 20:38:03

+2

我想提一下,因爲增加了lambda表達式'delegate(Match m){return m.Value +「*」; }'可以被替換爲'(Match m)=> return m.Value +「*」;'。耶進展。 – Pharap 2014-11-09 07:44:15

+8

^可以進一步簡化爲'(m)=> m.Value +「*」' – m1kael 2015-10-16 00:18:10