En un programa que estoy leyendo en algunos archivos de datos, parte de los cuales están formateados como una serie de registros, cada uno entre corchetes. Cada registro contiene un título de sección y una serie de pares clave/valor.¿Se puede mejorar este código de expresión regular C#?
Originalmente escribí código para recorrer y extraer los valores, pero decidí que se podía hacer de forma más elegante utilizando expresiones regulares. A continuación está mi código resultante (lo acabo de hackear por ahora en una aplicación de consola, así que sé que los nombres de las variables no son tan buenos, etc.
¿Puedes sugerir mejoras? Creo que no debería ser necesario hacerlo dos partidos y una subcadena, pero no puede encontrar la manera de hacerlo todo en un gran paso:
string input = "[section1 key1=value1 key2=value2][section2 key1=value1 key2=value2 key3=value3][section3 key1=value1]";
MatchCollection matches=Regex.Matches(input, @"\[[^\]]*\]");
foreach (Match match in matches)
{
string subinput = match.Value;
int firstSpace = subinput.IndexOf(' ');
string section = subinput.Substring(1, firstSpace-1);
Console.WriteLine(section);
MatchCollection newMatches = Regex.Matches(subinput.Substring(firstSpace + 1), @"\s*(\w+)\s*=\s*(\w+)\s*");
foreach (Match newMatch in newMatches)
{
Console.WriteLine("{0}={1}", newMatch.Groups[1].Value, newMatch.Groups[2].Value);
}
}
Bien, no sabía sobre usar la opción IgnorePatternWhitespace para permitirte formatear una expresión regular como esa. Gracias por el consejo. –
+1 nuevamente para el RegexOptions.IgnorePatternWhitespace, sí para la legibilidad –
+1 Yo también prefiero las capturas con nombre. Hacen que el código sea legible y fácil de entender. –