2009-03-03 20 views
1

Ich möchte eine reguläre Ausdruck Assembly von gemeinsamen Regex erstellen, die ich in meinem Projekt verwenden muss. Ich verwende diese regulären Ausdrücke, um ein Muster zu vergleichen und es zu ersetzen. Ich benutze diesen Code, der die Baugruppe erstellt.Kompiliert ersetzen regulären Ausdruck

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); 

Aber ich kann nicht finden, wo die Ersetzungszeichenfolge anzugeben ist. In der Tat werde ich diese Regexp verwenden, um die Tags in einer HTML-Datei durch ersetzen. Die Ersetzungszeichenfolge ist also ebenfalls konstant.

Ich möchte nicht, dass die aufrufende Assembly die Ersetzungszeichenfolge angibt, da sie immer gleich ist, über verschiedene aufrufende Assemblys.

Vielen Dank im Voraus für jede Beratung, Fabian

EDIT1:

Vielleicht misexplained ich, was ich tun muss. Ich habe mehrere reguläre Ausdrücke, die immer mit dem gleichen Muster ersetzt werden. Ich ersetze alle Zeichenfolge mit Zeichenfolge, Zeichenfolge mit Zeichenfolge, und so weiter.

Die kompilierten Regex sind großartig, aber ich vermisse das Ersatzmuster in der kompilierten Assembly. Es ist mir gelungen, einen Workaround mit einer Helper-Klasse zu erstellen, die ein Array von Transformationen erstellt.

Meine erste Frage war mehr das: Ist es eine Möglichkeit, in der kompilierten Regex die Ersatzzeichenfolge zu spezifizieren?

Antwort

2

Es sieht nicht so aus, als ob dies direkt von der "CompileToAssembly" -Methode unterstützt wird. Sie müssen also eine andere Möglichkeit finden, die Ersetzungszeichenfolge der Regex zuzuordnen. Wenn Sie die Ersetzungszeichenfolge in der generierten Assembly speichern möchten, besteht eine Option darin, sie in benutzerdefinierten Attributen anzugeben (dritter Parameter für "CompileToAssembly").

Ich denke, dies erzeugt speziell für die Montage-Attribute (und nicht für einzelne Regexes), aber man zum Beispiel so etwas wie verwenden könnte (Hinweis: Sie würden diese Texte selbst zuschreiben zu erklären haben):

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

Wenn Sie die generierte DLL aus Ihrer Anwendung verwenden, müssen Sie eine Behandlung hinzufügen, um die Ersetzungszeichenfolgen zu laden und sie zusammen mit den kompilierten Regex-Objekten in einer Klasse zu speichern. Das sieht ein bisschen schwierig aus, aber zumindest können Sie die Ersetzungszeichenfolge in der generierten DLL speichern, wenn Sie das anstreben.

+0

Gute Idee, was ich gefunden habe, ist das gleiche wie du, Regex unterstützt nicht die Ersatzzeichenfolge zur Kompilierzeit zu kennen. In der Zwischenzeit habe ich es geschafft, eine Helper-Klasse zu schreiben, die all das Zeug macht. –

3

.NET Reflector ist sehr hilfreich für solche Dinge. Werfen Sie einen Blick auf eine Baugruppe erstellt von Regex.CompileToAssembly

Die erstellten Typen stammen von Regex. Sie verwenden sie also genau, als würden Sie eine Regex-Instanz inline erstellen.


Re. BEARBEITEN In Frage: Die Antwort scheint zu sein: Es gibt keine Möglichkeit, spezifizierte Zeichenketten in die erzeugte Baugruppe aufzunehmen.

Allerdings bedeutet die Verwendung von CompileToAssembly einen mehrstufigen Build-Prozess (Erstellen des Assembly-Generators, Ausführen zum Erstellen einer Assembly und dann Verweisen auf diese Assembly). Dies kann durch Hinzufügen anderer Inhalte erweitert werden. Erstellen Sie die Regex-Assembly, und erstellen Sie eine Ersetzungsstrings-Assembly, und verwenden Sie dann ilmerge, um sie zu einem zu kombinieren.

+0

Ich fügte eine Klarstellung zu meiner ersten Frage hinzu. –

Verwandte Themen