Как работает 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 * "
.
Процесс продолжается таким образом: делегат вызывается один раз для каждого совпадения в исходной строке.