2010-06-30 5 views
4

Si j'ai une chaîne telle que « abcdef {123} ghi {456} kl », je veux créer une expression régulière qui me donnera toutes les parties séparées comme suit:Regex pour diviser le texte contenant des jetons

abcdef 
{123} 
ghi 
{456} 
kl 

J'utilise ce code, mais ne peut pas comprendre ce que l'expression doit être:

System.Text.RegularExpressions.Regex rex = new System.Text.RegularExpressions.Regex("expression"); 
foreach (System.Text.RegularExpressions.Match match in rex.Matches(sText).OfType<System.Text.RegularExpressions.Match>()) 
{ 
    ... 
} 
+0

Y a-t-il toujours exactement cinq parties? –

+0

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? –

Répondre

3

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.

+0

C'est un bon début. J'ai découvert des cas limites dont je dois rendre compte. Par exemple, dans "a {1} b {2} c {d {3} d" devrait retourner un, {1}, b {2}, c {d, {3}, d mais il retourne un, {1} , b, {2}, c, {d {3}, d – Jeremy

+0

Dans ce cas, utilisez la solution Split mais remplacez l'expression rationnelle par '({[^ {}] *})'. –

0
([a-z]+)({\d+})([a-z]+)({\d+})([a-z]+) 

fonctionnera, mais seulement s'il y a toujours cinq parties dans la chaîne. Peut-il y en avoir moins/plus de cinq?

+0

Il pourrait y avoir un nombre – Jeremy

Questions connexes