Как работает MatchEvaluator в Regex.Replace?

Это строка ввода 23x * y34x2. Я хочу вставить " * " (звезда, окруженная пробелами) после каждого номера, за которым следует буква, и после каждой буквы, за которой следует номер. Итак, моя строка ввода будет выглядеть так: 23 * x * y * 34 * x * 2.

Это регулярное выражение, выполняющее задание: @"\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??
}

Ответ 1

A MatchEvaluator является делегатом, который принимает объект Match и возвращает строку, которая должна быть заменена вместо соответствия. Вы также можете обратиться к группам из матча. Вы можете переписать свой код следующим образом:

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

Чтобы привести пример того, как это работает, при первом вызове делегата параметр Match будет соответствовать строке "3". Делегат в этом случае определяется для возврата самого совпадения как строки, объединенной с " * ". Поэтому первый "3" заменяется на "3 * ".

Процесс продолжается таким образом: делегат вызывается один раз для каждого совпадения в исходной строке.