2013-07-16 1 views
4

어쩌면 내가 완전히 지금 튀김 거니까하지만이 코드 :C# .NET을 정규식이 예상대로 작동하지

2 
vdi1.0.exe 
1.0 

난 경우 :

static void Main(string[] args) 
    { 
     Regex regx = new Regex(@"^.*(vdi([0-9]+\.[0-9]+)\.exe).*$"); 
     MatchCollection results = regx.Matches("vdi1.0.exe"); 
     Console.WriteLine(results.Count); 

     if (results.Count > 0) 
     { 
      foreach (Match r in results) 
      { 
       Console.WriteLine(r.ToString()); 
      } 
     } 
    } 

는 출력을 생성한다고 미친 게 아니야. 대신, 그냥 생산 :

1 
vdi1.0.exe 

내가 무엇이 누락 되었습니까?

+4

하위 그룹에 액세스하려면'Groups' 속성을 사용해야한다고 생각합니다. –

+0

마이크가 맞습니다. 당신은 그룹과의 경기를 혼란스럽게합니다. – Sven

+0

측점으로서, 정규식은 어떻게'1.1'을 그룹화합니까? 그 이벤트는'vdi1.0.exe'에서 발생하지 않습니다. '1.0 '을 원하셨습니까? – voithos

답변

8

정규식은 2 개의 하위 그룹이있는 Match 개체 한 개만 반환합니다. Match 개체의 Groups 컬렉션을 사용하여 해당 그룹에 액세스 할 수 있습니다.

같은 시도 :

foreach (Match r in results) // In your case, there will only be 1 match here 
{ 
    foreach(Group group in r.Groups) // Loop through the groups within your match 
    { 
     Console.WriteLine(group.Value); 
    } 
} 

를 이것은 당신이 경기를 통해 다음, 단일 문자열에서 여러 파일 이름을 루프를 일치하고, 부모 경기 내에서 각각의 그룹을 잡아 수 있습니다. 이것은 몇몇 언어들처럼 단일의 평평한 배열을 반환하는 것보다 조금 더 의미가 있습니다. 이 코드를 좀 더 읽기를 만들고, 그룹 오프셋 변경할 수 있습니다

string file = r.Groups["filename"].Value; 
string ver = r.Groups["version"].Value; 

: 당신은 이름으로 그룹을 참조 할 수 있습니다, 그리고

Regex regx = new Regex(@"^.*(?<filename>vdi(?<version>[0-9]+\.[0-9]+)\.exe).*$"); 

: 또한, 나는 당신의 그룹 이름을 부여 생각 하는데요 사물을 깨지 않고.

또한 항상 하나의 파일 이름 만 구문 분석하는 경우 MatchCollection을 반복해서 사용할 이유가 없습니다. 하나의 Match 객체를 얻으려면

Match result = regx.Match("vdi1.0.exe"); 

, 이름 또는 인덱스로 각 Group 액세스 :

MatchCollection results = regx.Matches("vdi1.0.exe"); 

에 : 당신은 변경할 수 있습니다.

+0

감사합니다. 마이크 - 그룹 이름 지정에 대해 알지 못했습니다. 나는 지금 그렇게하고있다. – Bodacious

관련 문제