2009-09-24 20 views
5

Estoy intentando crear un patrón de expresiones regulares con algunas partes del patrón recuperadas de una base de datos.Creación de patrones Regex dinámicos en C#

Por ejemplo

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

Aunque traté de escapar de ella, no pude conseguir que funcione. Si construyo el patrón manualmente como

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

funciona bien.

Respuesta

18

Trate

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

o alternativamente:

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

La razón básica es que el patrón que da como ejemplo y la cadena que se está construyendo son bastante diferentes. Las cosas como cadenas literales, como @"foo" solo importan al compilador de C#, después de la compilación todas las cadenas son iguales. Las dos cadenas @"\b" y "\\b" son completamente iguales, la única diferencia está en cómo el compilador C# evalúa los caracteres de escape dentro de él. Lo que significa que no hay absolutamente ninguna necesidad de incorporar la sintaxis de C# en las cadenas que utiliza en el tiempo de ejecución.

Básicamente la cadena que se crea está contenido:

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

mientras que usted quería el patrón

\b(test|test2)\b 

Así partes como el signo @ y las comillas son literales para la expresión regular. Por lo tanto, no coincidiría.

Cuestiones relacionadas