Это - входная строка 23x * y34x2
. Я хочу вставить " * "
(звезда, окруженная пробелами) после каждого числа, сопровождаемого по буквам, и после каждой буквы, сопровождаемой числом. Таким образом, моя входная строка была бы похожа на это: 23 * x * y * 34 * x * 2
.
Это - regex, который делает задание: @"\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
? I'am, плохо знакомые с regex и, не понимают хорошую замену 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??
}
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 *»
.
Процесс продолжается таким образом, делегат вызывается один раз для каждого совпадения в исходной строке.