2009-03-03 104 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); 

但是,我找不到指定替換字符串的位置。實際上,我將使用這些正則表達式來替換HTML文件中的標籤。所以,替換字符串也是不變的。

我不希望調用程序集指定替換字符串,因爲在不同的調用程序集中它們總是相同的。

預先感謝任何意見, 費邊

EDIT1:

也許我misexplained什麼,我需要做的。我有幾個正則表達式,總是用相同的模式替換。我用字符串替換所有字符串,用字符串替換字符串,依此類推。

編譯後的正則表達式很好,但是我懷念編譯程序集中的替換模式。我設法建立一個解決方案,用一個Helper類構建一個Tranformation數組。

我最初的問題是更多這是:是否在編譯正則表達式中指定替換字符串?

回答

2

它看起來不像是由「CompileToAssembly」方法直接支持的,所以你必須找到其他方法將替換字符串與正則表達式關聯起來。如果要將替換字符串存儲在生成的程序集中,則我能想到的一個選項是在自定義屬性中指定它(第三個參數爲「CompileToAssembly」)。

我想這生成用於組裝自定義屬性(而不是單一的正則表達式),但你可以例如使用類似(注:你必須聲明這個屬性自己):

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

在應用程序中使用生成的DLL時,必須添加一些處理來加載替換字符串,並將它們與編譯後的Regex對象一起存儲在某個類中。這看起來有點困難,但至少,讓我們將替換字符串存儲在生成的DLL中,如果這就是你想要的。

+0

好主意,我發現的和你一樣,正則表達式不支持在編譯時知道替換字符串。與此同時,我設法編寫了一個可以完成所有工作的助手類。 – 2009-03-03 12:17:01

3

.NET Reflector對這樣的事情非常有幫助。看看由Regex.CompileToAssembly創建的程序集

創建的類型來自正則表達式。所以你可以使用它們,就像一樣,你會創建一個內嵌的Regex實例。


Re。編輯有問題:答案似乎是:沒有辦法在生成的程序集中包含指定的字符串。

但是,考慮到使用CompileToAssembly意味着多步構建過程(創建程序集生成器,運行它以創建程序集,然後引用該程序集),可以將其擴展以添加其他內容。創建正則表達式程序集,並創建替換字符串程序集,然後使用ilmerge將它們合併爲一個。

+0

我在我最初的問題上添加了一個說明。 – 2009-03-03 10:38:23