2011-05-28 4 views
1

Je souhaite extraire des données de chaîne d'un fichier donné. Le fichier a une structure telle que:Extraire les valeurs numériques entre accolades


name, catg, {y:2006, v:1000, c:100, vt:1}, {y:2007, v:1000, c:100, vt:1},.. {..}...


Je veux extraire les valeurs suivantes:

    nom
  • ;
  • catg;
  • numéros après y, v, c, vt;

I utilisée la prochaine regexes:

  • @"(?<name>\w+), (?<cat>\w+)" pour l'extraction des deux premiers éléments;
  • @"(?:\{y:(?<y>\d+), +v:(?<v>\d+), +c:(?<c>\d+), +vt:(?<vt>\d+)\}, ?)+" pour l'extraction d'autres valeurs incluses entre accolades.

J'ai concaténé ces deux et fait un test dans un testeur de regex. Mais comme prévu, je n'ai qu'un seul ensemble de nombres extraits. Et j'ai besoin de résultat de l'autre partie ({y:2007, v:1000, c:100, vt:1}). De plus, il pourrait y avoir plus de deux parties.

Comment réparer mon regex? Et puis, comment puis-je collecter tous les ensembles de numéros à partir des parties correspondantes.

Répondre

1

regex est ici fixe (vous devez spécifier l'option IgnorePatternWhitespace):

(?'name'\w+), \s* 
(?'category'\w+), \s* 
(?: 
    \{ \s* 
     y: (?'y'\d+), \s* 
     v: (?'v'\d+), \s* 
     c: (?'c'\d+), \s* 
     vt: (?'vt'\d+) 
    \} \s* 
    ,? \s* 
)* 

Et voici l'utilisation:

String input = @"name, catg, {y:2006, v:1000, c:100, vt:1}, {y:2007, v:1000, c:100, vt:1}"; 
String pattern = 
     @"(?'name'\w+), \s* 
     (?'category'\w+), \s* 
     (?: 
      \{ \s* 
       y: (?'y'\d+), \s* 
       v: (?'v'\d+), \s* 
       c: (?'c'\d+), \s* 
       vt: (?'vt'\d+) 
      \} \s* 
      ,? \s* 
     )* "; 
RegexOptions options = RegexOptions.IgnoreCase | RegexOptions.IgnorePatternWhitespace | RegexOptions.Singleline; 

Match match = Regex.Match(input, pattern, options); 
if (match.Success) 
{ 
    String name = match.Groups["name"].Value; 
    String category = match.Groups["category"].Value; 

    Console.WriteLine("name = {0}, category = {1}", name, category); 

    for (Int32 i = 0; i < match.Groups["y"].Captures.Count; ++i) 
    { 
     Int32 y = Int32.Parse(match.Groups["y"].Captures[i].Value); 
     Int32 v = Int32.Parse(match.Groups["v"].Captures[i].Value); 
     Int32 c = Int32.Parse(match.Groups["c"].Captures[i].Value); 
     Int32 vt = Int32.Parse(match.Groups["vt"].Captures[i].Value); 

     Console.WriteLine("y = {0}, v = {1}, c = {2}, vt = {3}", y, v, c, vt); 
    } 
} 
+0

Ok! Comment obtenir des groupes extraits? – lexeme

+0

@helicera, je viens d'ajouter un exemple d'utilisation :) –

+0

Oui, je vois)) Merci! – lexeme

Questions connexes