Dans un programme, je lis dans certains fichiers de données, dont une partie est formatée comme une série d'enregistrements entre crochets. Chaque enregistrement contient un titre de section et une série de paires clé/valeur.Pouvez-vous améliorer ce code d'expression régulière C#?
A l'origine, j'ai écrit du code pour faire une boucle et extraire les valeurs, mais j'ai décidé que cela pourrait être fait plus élégamment en utilisant des expressions régulières. Ci-dessous est mon code résultant (je l'ai juste piraté pour le moment dans une application de la console - donc connaître les noms de variables ne sont pas géniaux, etc
Pouvez-vous suggérer des améliorations? Je pense qu'il ne devrait pas être nécessaire de faire deux matches et une sous-chaîne, mais ne peuvent pas comprendre comment le faire tout en un grand pas:
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, je ne savais pas utiliser l'option IgnorePatternWhitespace pour vous permettre de formater une regex comme ça. Merci pour le conseil. –
+1 à nouveau pour le RegexOptions.IgnorePatternWhitespace ouais pour la lisibilité –
+1 Je préfère aussi les captures nommées. Ils rendent le code lisible et facile à comprendre. –