2009-09-24 7 views
5

Je tente de créer un motif regex avec certaines parties de motif extraites d'une base de données.Création de motifs Regex dynamiques en C#

Par exemple

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

Bien que j'essayé d'échapper, je ne pouvais pas le faire fonctionner. Si je construis le modèle manuellement comme

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

cela fonctionne très bien.

Répondre

18

Essayez

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

ou bien:

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

La raison fondamentale est que le modèle que vous donnez comme exemple et la chaîne que vous construisez sont tout à fait différents. Des choses comme les chaînes littérales, telles que @"foo" ne sont importantes que pour le compilateur C#, après la compilation, toutes les chaînes sont égales. Les deux chaînes @"\b" et "\\b" sont complètement égales, la seule différence est dans la façon dont le compilateur C# évalue les caractères d'échappement à l'intérieur. Ce qui signifie qu'il n'est absolument pas nécessaire d'incorporer la syntaxe C# dans les chaînes que vous utilisez au moment de l'exécution.

Fondamentalement, la chaîne créée contenait:

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

alors que vous vouliez le motif

\b(test|test2)\b 

Alors pièces comme le signe @ et les guillemets sont littéraux pour l'expression rationnelle. Ainsi, cela ne correspondrait pas.

Questions connexes