2010-03-23 4 views
0

J'essaie de regrouper la chaîne suivante en trois groupes.Regex Matches ne fonctionnant pas comme

0:0:Awesome:awesome 

Cela étant "", "" et "Impressionnant: génial"

En utilisant cette expression régulière:

^([0-9]+)\:([0-9]*)\:(.*)$ 

Il fonctionne très bien sur regex en ligne services: http://rubular.com/r/QePxt57EwU

Mais il semble que .NET ne soit pas d'accord. Picture of Regex problem from Visual Studio http://xs.to/image-3F8A_4BA916BD.jpg

+1

Rubular utilise le moteur d'expression rationnelle de Ruby, qui n'est pas identique à celui de .NET. Pour ce modèle, je ne vois pas pourquoi cela ne devrait pas fonctionner, mais juste quelque chose à garder à l'esprit. –

+0

Ajoutant à ce que Daniel a dit, un excellent outil pour tester les expressions régulières .NET est Expresso, bien que tester le vôtre semble fonctionner correctement pour moi. http://www.ultrapico.com/Expresso.htm – FrustratedWithFormsDesigner

Répondre

5

Le MatchCollection contient les résultats de l'application de l'expression régulière à la chaîne source itérativement. Dans votre cas, il n'y a qu'une seule correspondance - donc les résultats sont corrects. Ce que vous avez sont plusieurs captures dans le match. C'est ce que vous voulez comparer - pas le nombre de matches.

MatchCollection matches = RegEx.Matches("0:0:Awesome:awesome", 
             "^([0-9]+)\:([0-9]*)\:(.*)$"); 

if(matches.Count != 1 && matches[0].Captures.Count != 3) 
    //... 
+0

Je vous remercie beaucoup! Erreur stupide. –

0

Je pense que cette expression rationnelle conviendrait

 
(?<nums>\d+\:?)+(?<rest>.*) 

Ensuite, vous pouvez obtenir les groupes pour « num » et « repos » ensemble comme indiqué

 
public Regex MyRegex = new Regex(
     "^(?<nums>\\d+\\:?)+(?<rest>.*)$", 
    RegexOptions.IgnoreCase 
    | RegexOptions.CultureInvariant 
    | RegexOptions.IgnorePatternWhitespace 
    | RegexOptions.Compiled 
    ); 
MatchCollection ms = MyRegex.Matches(InputText); 

InputText contiendrait l'échantillon '0: 0: Génial: Génial'

1

Lorsque vous souhaitez accéder aux groupes correspondants ing peut vous aider

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Text.RegularExpressions; 

namespace Test 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      var pattern = "^([0-9]+)\\:([0-9]*)\\:(.*)$"; 

      var matches = Regex.Match("0:0:Awesome:awesome", pattern); 

      foreach (var match in matches.Groups) 
       Console.WriteLine(match); 
     } 
    } 
} 
Questions connexes