2009-09-24 9 views
5

Ich versuche, ein Regex-Muster mit einigen Teilen des Musters aus einer Datenbank abgerufen.Erstellen dynamischer Regex-Muster in C#

Zum Beispiel

string pt= "@\"\\b(" + db.GetPattern + ")\\b\"";   
Regex regex = new Regex(pt, RegexOptions.IgnoreCase | RegexOptions.Compiled); 
return regex.Replace(input, "*"); 

Obwohl ich es versuchte zu fliehen, konnte ich es nicht zu arbeiten. Wenn ich das Muster manuell als

Regex regex = new Regex(@"\b(test|test2)\b", RegexOptions.IgnoreCase | RegexOptions.Compiled); 
return regex.Replace(input, "*"); 

bauen, funktioniert es gut.

Antwort

18

Versuchen

string pt = @"\b(" + db.GetPattern + @")\b"; 

oder alternativ:

string pt = string.Concat(@"\b(", db.GetPattern, @")\b"); 

Der Hauptgrund ist, dass das Muster, das Sie als ein Beispiel geben und die Zeichenfolge, die Sie bauen ganz unterschiedlich sind. Dinge wie literale Strings, wie @"foo" sind nur für den C# -Compiler wichtig, nach der Kompilierung sind alle Strings gleich. Die beiden Zeichenfolgen @"\b" und "\\b" sind vollkommen gleich, der einzige Unterschied besteht darin, wie der C# -Compiler darin enthaltene Escape-Zeichen bewertet. Das bedeutet, dass es absolut nicht notwendig ist, C# -Syntax in Strings zu integrieren, die Sie zur Laufzeit verwenden.

Grundsätzlich ist die Zeichenfolge, die Sie erstellt enthalten:

@"\b(test|test2)\b" 

während Sie das Muster

\b(test|test2)\b 

So Teile wie die @ Zeichen und die Anführungszeichen waren Literale für die regex gesucht. Also würde es nicht zusammenpassen.