Использование делегата MatchEvaluator для создания списка без использования переменных класса? - PullRequest
1 голос
/ 30 марта 2009

Справочная информация: Я пытаюсь создать список ссылок со страницы, на которой есть ссылки, и заменить разметку ссылок на HTML.

Я работаю в C #

Текст выглядит примерно так:

The dog ate 3 cats and felt ill <ref name="something">http://cateater.com</ref>

Я бы хотел использовать метод Regex.Replace, чтобы заменить все <ref> s, помещая их в хэш, который я позже смогу представить как список ссылок.

Проблема: похоже, что способ запуска кода во время операции замены заключается в использовании «MatchEvaluator Delegate», который принимает объект Match, но не похоже, что он может принимать другие параметры.

В примере на MSDN для этого используется переменная класса, но я надеюсь, что есть более элегантное решение.

Ответы [ 2 ]

3 голосов
/ 30 марта 2009

Поскольку вы используете теги XML, есть ли причина, по которой исходный документ не может быть обработан как XML DOM? В этом случае использовать XSLT будет намного проще, чем RegEx.

Если нет, то можно эффективно парализовать делегат MatchEvaluator с помощью анонимной функции: -

MatchEvaluator evaluator = delegate(Match m)
{
    // code to return replacement
    // this code uses and modifies lookups
}

Dictionary<string, string> lookups = new Dictionary<string, string>();
sOutput = someRegex.Replace(sInput, evaluator);
0 голосов
/ 07 мая 2014

Используйте следующее, чтобы получить список ссылок:

var srcmatches = Regex.Matches(src, "<ref .*?>(.*?)</ref>");

List<string> refs = srcmatches.OfType<Match>().Select(x => x.Groups[1].ToString()).ToList();

сначала он соответствует тегам <ref>, затем запрашивает содержимое тега и преобразует его в список строк.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...