Как вы используете регулярные выражения для замены определенного соответствия (например, «последний» или «второй до последнего»)? - PullRequest
5 голосов
/ 31 декабря 2010

Я пытаюсь заменить одно (последнее или предпоследнее) совпадение в строке.У меня уже есть Регулярное выражение, и оно работает, но оно заменяет ВСЕ элементы, затем мне нужно вернуться и заменить один элемент.

Regex.Replace(BaseString, MatchString, ReplacementString)

Я хочу использовать MatchEvaluator, но не могу понять, как.

Любая помощь?

Ответы [ 3 ]

13 голосов
/ 31 декабря 2010

MatchEvaluator является просто делегатом. Вы передаете свою функцию.

В вашем случае используйте что-то вроде:

Regex.Replace(BaseString, MatchString, delegate(Match match)
                    {
                        bool last = match.NextMatch().Index == 0;

                        if (last)
                            return match.Value;
                        else
                            return ReplacementString;
                    }, RegexOptions.Compiled);

Этот код пропускает последнее совпадение. Вы также можете проверить наличие следующего до последнего совпадения аналогичным образом.

Также см. Этот вопрос для получения дополнительной информации о том, как использовать MatchEvaluator: Как работает MatchEvaluator в Regex.Replace?

4 голосов
/ 31 декабря 2010

Это заменить последнее вхождение в строке:

String testString = "It is a very good day isn't it or is it.Tell me?";
Console.WriteLine(Regex.Replace(testString, 
                  "(.*)(it)(.*)$", 
                  "$1THAT$3", 
                   RegexOptions.IgnoreCase));

Если вы можете указать, когда следует заменить следующий за последним, я могу отредактировать ответ, включив его.

0 голосов
/ 31 декабря 2010

найти в цикле, сохранить позицию последнего совпадения, затем заменить

...