2009-03-03 6 views
1

Я хотел бы построить сборку регулярных выражений общего регулярного выражения, которое я должен использовать в своем проекте. Я использую эти регулярные выражения для соответствия шаблону и его замены. Я использую этот кусок кода, который строит сборку.Скомпилировано заменить регулярное выражение

AssemblyName an = new AssemblyName("MyRegExp"); 

RegexCompilationInfo[] rciList = { 
    new RegexCompilationInfo(@"\<b\>(.+?)\<\/b\>", RegexOptions.IgnoreCase, "BoldCode", "MyRegExp", true), 
    new RegexCompilationInfo(@"\<i\>(.+?)\<\/i\>", RegexOptions.IgnoreCase, "ItalicCode", "MyRegExp", true) 
}; 

Regex.CompileToAssembly(rciList, an); 

Но я не могу найти, где указать строку замены. На самом деле, я буду использовать это regexp для замены тегов в html-файле. Таким образом, строка replace также является постоянной.

Я не хочу, чтобы вызывающая сборка указывала строку замены, так как она всегда одна и та же, в отличие от разных сборочных сборок.

Заранее спасибо за любой совет, Fabian

EDIT1:

Может быть, я misexplained, что мне нужно делать. У меня есть несколько регулярных выражений, которые всегда заменяются одним и тем же шаблоном. Я заменяю всю строку на строку, строка со строкой и так далее.

Скомпилированное регулярное выражение отлично, но я пропустил шаблон замены в скомпилированном сборке. Мне удалось создать обходное решение с классом Helper, чтобы построить массив Tranformation.

Мой первоначальный вопрос был больше: это способ указать в скомпилированном регулярном выражении строку замены?

ответ

2

Не похоже, что это напрямую поддерживается методом «CompileToAssembly», поэтому вам придется найти другой способ связать заменяемую строку с регулярным выражением. Если вы хотите сохранить заменяющую строку в сгенерированной сборке, то одним из вариантов, о котором я могу думать, является указание ее в пользовательских атрибутах (третий параметр - «CompileToAssembly»).

Я думаю, что это создает пользовательские атрибуты для сборки (а не для одного регулярных выражений), но вы могли бы, например, использовать что-то вроде (Примечание: вы должны заявить о себе этот атрибут):

[RegexReplaceString("RegexName", "Replacement")] 

При использовании сгенерированной DLL из вашего приложения вам придется добавить некоторую обработку, чтобы загрузить заменяющие строки и сохранить их вместе с скомпилированными объектами Regex в некотором классе. Это выглядит немного сложно, но, по крайней мере, он позволяет вам хранить заменяющую строку в сгенерированной DLL, если это то, к чему вы стремитесь.

+0

Хорошая идея, то, что я нашел, такое же, как вы, Regex не поддерживает знание строки замены во время компиляции. Тем временем мне удалось написать класс Helper, который делает все. –

3

.NET Reflector очень полезно для таких вещей. Взгляд на сборку, созданную Regex.CompileToAssembly

Созданные типы происходят из Regex. Таким образом, вы используете их точно, так как вы бы создали экземпляр Regex, созданный inline.


Re. РЕДАКТИРОВАТЬ В вопросе: ответ представляется: нет способа включить указанные строки в сгенерированную сборку.

Однако, учитывая, что использование CompileToAssembly предполагает многоэтапный процесс сборки (создание генератора сборки, запуск его для создания сборки, а затем ссылку на эту сборку), можно расширить его, чтобы добавить другое содержимое. Создайте сборку регулярных выражений и создайте сборку строк замен, затем используйте ilmerge, чтобы объединить их в один.

+0

Я добавил разъяснение по моему первоначальному вопросу. –