Vous devriez probablement utiliser using
déclarations au lieu d'écrire l'espace de noms en plein chaque fois. À première vue, votre code semble assez complexe, mais lorsque vous supprimez tous les espaces de noms, il s'avère très simple. En outre, le OfType
n'est pas nécessaire.
L'expression régulière doit correspondre autant que possible qui n'est pas une accolade ouverte [^{]*
ou bien une accolade ouverte, du texte et une accolade de fermeture {[^}]*}
. L'expression régulière pour cela est:
{[^}]*}|[^{]*
Essayez ce code:
string text = "abcdef{123}ghi{456}kl";
Regex regex = new Regex("{[^}]*}|[^{]*");
foreach (Match match in regex.Matches(text))
{
Console.WriteLine(match.Value);
}
Sortie:
abcdef
{123}
ghi
{456}
kl
Note: cette expression régulière ne valide pas que la chaîne est dans le bon format , il suppose qu'il est bien formé.
Une méthode un peu plus simple consiste à utiliser de Split au lieu de correspondances et comprennent un groupe de capture dans l'expression régulière afin que le séparateur est également inclus dans la sortie:
string text = "abcdef{123}ghi{456}kl";
Regex regex = new Regex("({[^}]*})");
foreach (string part in regex.Split(text))
{
Console.WriteLine(part);
}
La sortie de c'est le même que au dessus.
Y a-t-il toujours exactement cinq parties? –
Pouvez-vous être un peu plus précis sur la façon dont les accolades supplémentaires doivent être manipulées, et sur la façon dont les accolades imbriquées doivent être manipulées? –