2009-03-30 3 views
1

Фон: Я пытаюсь сгенерировать список ссылок со страницы, на которой есть ссылки, и заменить ссылочную разметку на HTML.Использование делегата MatchEvaluator для создания списка без использования переменных класса?

Я работаю в C#

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

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

Я хотел бы использовать метод Regex.Replace заменить все <ref> с, толкая их в Hash, что Впоследствии я могу отобразить список ссылок.

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

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

ответ

3

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

Если нет, то можно эффективно paramatize 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

Желаю! источник представляет собой смесь HTML, wiki-разметки и других вещей, подобных этим элементов .. :( –

0

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

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

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

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