Как делает MatchEvaluator в Regex. Работа замены?

Это - входная строка 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??
}
43
задан Gilad Green 23 October 2016 в 13:10
поделиться

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

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

63
ответ дан 26 November 2019 в 23:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: