Есть ли способ выполнить динамическую замену в регулярном выражении? - PullRequest
10 голосов
/ 07 апреля 2011

Есть ли способ заменить регулярное выражение в C # 4.0 с помощью функции текста, содержащегося в совпадении?

В php есть что-то вроде этого:

reg_replace('hello world yay','(?=')\s(?=')', randomfunction('$0'));

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

1 Ответ

10 голосов
/ 07 апреля 2011

См. Методы Regex.Replace с перегрузкой MatchEvaluator. MatchEvaluator - это метод, который можно указать для обработки каждого отдельного совпадения и возврата того, что следует использовать в качестве текста замены для этого совпадения.

Например, это ...

Кошка перепрыгнула через собаку.
0: THE 1: CAT перепрыгнул через 2: THE 3: DOG.

... является выводом из следующего:

using System;
using System.Text.RegularExpressions;

namespace MatchEvaluatorTest
{
    class Program
    {
        static void Main(string[] args)
        {
            string text = "The cat jumped over the dog.";
            Console.WriteLine(text);
            Console.WriteLine(Transform(text));
        }

        static string Transform(string text)
        {
            int matchNumber = 0;

            return Regex.Replace(
                text,
                @"\b\w{3}\b",
                m => Replacement(m.Captures[0].Value, matchNumber++)
            );
        }

        static string Replacement(string s, int i)
        {
            return string.Format("{0}:{1}", i, s.ToUpper());
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...