2011-09-08 13 views
5

Normalmente termino con muchas condiciones y/o bucles para analizar una expresión regular e interpolar los valores en sus grupos de captura, y estoy buscando respuestas con experiencia para resolver este problema con suerte de una manera simple.¿Forma más sencilla de construir una cadena mediante la interpolación de valores en un patrón Regex?

Por ejemplo, dado un patrón de expresión regular como X(?<xid>\d+)-(?<xsub>\w+)\.xml que tiene los grupos de captura con nombre "XID" y "XSUB", destinados para que coincida con los nombres de archivo como: X1-foo.xml, X555-bar.xml, etc., cuando se les proporciona los argumentos: int xid=999, string xsub="baz", quiero para interpolar los valores en los grupos de patrones para construir el nombre de archivo correcto: X999-baz.xml

que sea sencillo, capturas explícitas no están anidados.


Sin String.Format:

Este concepto se logra fácilmente con elementos de formato .NET cadena como String.Format("X{0}-{1}.xml", xid, xsub) sin embargo, ya tienen un patrón de expresión regular para analizar fuera de esos valores de cualquier cadena de nombre de archivo y quieren para usar el mismo patrón para ir en la dirección opuesta reconstruyendo un nombre de archivo con él, para mayor precisión. Si requiero un patrón de expresiones regulares para analizar valores de una cadena, pero una cadena con elementos de formato para reconstruir el nombre de archivo, se requieren dos tipos de sintaxis distintas, lo que crea una mayor probabilidad de error manual al escribirlas: es demasiado fácil cree erróneamente una cadena de elemento de formato incorrecto que no reconstruya correctamente el resultado de una coincidencia de patrón de expresión regular, o viceversa.

Respuesta

0

Puede que haya leído esto mal, pero parece que necesita el método Regex.Replace en el espacio de nombres System.Text.RegularExpressions.

string pattern = "Your pattern"; 
string replacement = "Your text to replace"; 
Regex rgx = new Regex(pattern); 
string result = rgx.Replace(input, replacement); 

Existen otros métodos en la biblioteca de expresiones regulares que pueden acomodar mejor reemplazos múltiples en una sola cadena.

+2

En esta situación, la expresión regular es de hecho la 'entrada'. – BoltClock

2

Puede utilizar expresiones regulares (yay, meta-expresiones regulares!):

public static string RegexInterp(Regex pattern, Dictionary<string, string> pairs) { 
    string regex = pattern.ToString(); 
    string search; 

    foreach(KeyValuePair<string, string> entry in pairs) 
    { 
     // using negative lookbehind so it doesn't match escaped parens 
     search = @"\(\?<" + entry.Key + @">.*?(?<!\\)\)"; 
     regex = Regex.Replace(regex, search, entry.Value); 
    } 

    return Regex.Unescape(unescaped); 
} 

Y luego:

Regex rx = new Regex(@"X(?<xid>\d\d+)-(?<xsub>\w+)\.xml"); 

var values = new Dictionary <string, string>() {{"xid", "999"}, 
               {"xsub", "baz"}} ; 

Console.WriteLine(RegexInterp(rx, values));  

imprime

X999-baz.xml 

Demostración: http://ideone.com/QwI2W

Cuestiones relacionadas