2012-07-24 11 views
2

Je suis en train de faire correspondre le modèle suivant en utilisant C# et obtenir aucune correspondance trouvéeRegex ne correspond pas à en C#

Regex

^([[a-z][A-Z]]*):([[a-z][A-Z][0-9],]*)$ 

Sample Chaîne

Student:Tom,Jerry 

Alors que la même chose travaille à ruby ​​(vérifié avec Rubular). Une idée de pourquoi cela ne fonctionne pas dans C#?

Bloc de code

public static KeyValuePair<string, IList<string>> Parse(string s) 
    { 
     var pattern = new Regex(@"(\w*):([\w\d,]*)"); 
     var matches = pattern.Matches(s); 
     if (matches.Count == 2) 
     { 
      return new KeyValuePair<string, IList<string>>(matches[0].Value, matches[1].Value.Split(',')); 
     } 

     throw new System.FormatException(); 
    } 
+0

Vraiment, je ne connais pas c, avez-vous besoin d'échapper à quelque chose? – Sturm

+1

Vous faites des plages incorrectes, devrait être: '^ ([a-zA-Z] *): ([a-zA-Z0-9,] *) $' – hazzik

+1

[RegExr] (http://gskinner.com/RegExr /) est un bon outil pour ce genre de chose: Voici votre exemple [travail] (http://regexr.com?31kih) et [ne fonctionne pas] (http://regexr.com?31kik). – RichardTowers

Répondre

9

Essayez de changer regex légèrement: -

([a-zA-Z]*):([a-zA-Z0-9,]*) 

Vous pouvez même simplifier un peu plus loin si vous voulez que tous les caractères de texte (y compris underscore), sinon utilisez celui ci-dessus.

(\w*):([\w\d,]*) 

Il n'y a pas besoin de groupes multi-groupes tels que [[a-z][A-Z]]

+0

Cela fonctionne mais quand j'appelle Matches je reçois seulement un match alors que je m'attends à deux groupes de correspondance –

+0

@KrishnaswamySubramanian utilisez-vous toujours la même phrase de test? Je viens d'essayer sur http://regexr.com?31kin et sur une application C# et cela fonctionne parfaitement pour moi :(En utilisant "Etudiant: Tom, Jerry" Il montre deux groupes "Etudiant" et "Tom, Jerry" –

+0

Oui, mais toujours un seul résultat var pattern = new Regex (@ "(\ w *): ([\ w \ d,] *)"); pattern.matches ("Étudiant: Tom, Jerry") –

1

Vous pouvez simplifier encore plus:

^([A-z]*):([\w,]*)$ 

Le premier groupe est équivalent à [a-zA-Z] et la seconde à [a-zA-Z0-9]. Si vous voulez que le premier groupe corresponde aux chiffres et aux caractères, vous pouvez simplement utiliser \w partout.