2010-03-23 5 views
0

다음 문자열을 세 그룹으로 그룹화하려고합니다.정규식이 예외로 작동하지 않습니다.

0:0:Awesome:awesome 

그 "0", "0"과 "최고 : 멋진"인 :

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

그것은 온라인 정규식에 잘 작동이 정규 표현식을 사용

을 서비스 : http://rubular.com/r/QePxt57EwU

하지만 .NET처럼 동의하지 않는 것 같습니다. Picture of Regex problem from Visual Studio http://xs.to/image-3F8A_4BA916BD.jpg

+1

Rubular는 .NET의 것과는 다른 Ruby의 regexp 엔진을 사용합니다. 이 패턴의 경우 작동하지 않아야하는 이유는 없지만 염두에 두어야 할 이유가 없습니다. –

+0

Daniel이 말한 것 외에 .NET 정규 표현식을 테스트하기위한 훌륭한 도구는 Expresso입니다. 테스트가 제대로 작동하는 것처럼 보입니다. http://www.ultrapico.com/Expresso.htm – FrustratedWithFormsDesigner

답변

5

MatchCollection에는 정규식을 원본 문자열에 반복적으로 적용한 결과가 포함되어 있습니다. 귀하의 경우 일치하는 것이 하나뿐이므로 결과가 정확합니다. 당신은 다수의 포착가 있습니다. 이것은 당신이 비교하기를 원하는 것입니다. 일치하는 숫자가 아닙니다.

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

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

정말 고마워요! 멍청한 실수. –

0

나는 InputText 샘플을 포함 할 경우

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

을 같이이 정규 표현식 함께 그런 다음 'NUM'과 '휴식'에 대한 그룹을 얻을 수

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

맞는 것 같아 '0 : 0 : 굉장하다 : 끔찍하다'

1

일치하는 그룹에 액세스하려면 당신을 도울 수

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); 
     } 
    } 
} 
관련 문제