Как работает MatchEvaluator в Regex.Replace? - PullRequest
43 голосов
/ 07 апреля 2010

Это входная строка 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 Ответ

61 голосов
/ 07 апреля 2010

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 * ".

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

...