2013-05-06 1 views
1

IndexOutOfRangeException 예외가 예상되는만큼이 코드가 오류를 발생시키지 않는 이유는 다소 혼란 스럽습니다.Regex Match Group에 오류가 없음에 대한 설명

Regex re = new Regex(@"(\d+)"); 
Match result = re.Match("123456789"); 
Console.WriteLine(result.Groups[1000000000].Value); 

누구든지 그의 생각을 설명 할 수 있습니까?

+0

그리고'result.Groups [10000 : 우리 각자가 간단한 작성 선출하는 방법보다는 조금 다른이야 방법 (이미이에 대한 BCL 지원을 따로 설정을) 문자열을-포함 ]'도 null이 아닌가? 출력은 무엇입니까? – SimpleVar

+0

예. 'string.Empty'의 값은 그 값입니다. – lexeRoy

답변

3

그룹스는 배열이 아니며 색인 된 속성입니다. 그것은 무엇이든 그 코드에 의존하여 반환 할 수 있습니다. MSDN에서

public Group this[int groupnum] { get; } 

UPD :

당신은 Count 속성 값을 검색하여 컬렉션의 항목 수를 확인할 수 있습니다. groupnum 매개 변수의 유효 값은 0에서 1까지이며 컬렉션의 항목 수보다 작습니다.

Match.Groups 속성에서 반환 한 GroupCollection 개체 에는 항상 멤버가 하나 이상 있습니다. 정규 표현식 엔진 이 특정 입력 문자열에서 일치하는 항목을 찾을 수없는 경우 컬렉션의 단일 그룹 개체의 Group.Success 속성이 false로 설정되어 으로 설정되고 해당 Group.Value 속성이 String.Empty로 설정됩니다.

groupnum 컬렉션의 부재의 지표가 아니거나 groupnum 입력 문자열 매칭되지 않은 캡처 그룹의 인덱스 인 경우,이 방법은 그 그룹 그룹 객체를 리턴하는 경우. Success 속성은 false이고 Group.Value 속성은 String.Empty입니다.

+0

-1 OP가 왜, 왜 그런지 묻습니다. 배열 인덱싱조차도 일부 코드로 변환됩니다. 그것은 다른 코드로 번역 될 수있었습니다. 이것은 답이 아닙니다. – SimpleVar

+0

업데이트 후에 +1로 바뀝니다. 이제는 개발자의 이유가 없을 수도 있지만 사용법을 설명하는 설명서가 있습니다. – SimpleVar

+0

MSDN 문서에서 언급 한 내용이 여전히 혼란 스럽다는 것을 알게되었습니다.당신이 나에 대해 정당화 한 색인 된 속성을 설명 할 때까지. 감사! – lexeRoy

0

나는 이것을 구현 선택으로 ch 것이다. 심지어 -1 작품 :

는 는
DataTable dt = new DataTable(); 
dt.Columns.Add(new DataColumn("A")); 
DataColumn existent = dt.Columns[0]; // works 
DataColumn nonexistent = dt.Columns[1]; // doesn't work - IndexOutOfRangeException 

아마 누군가에 대한 통찰력을 제공 할 수 : 그것은 IndexOutOfRangeException을 던질 수있는 표시 DataColumnCollection.Item Property (Int32) documentation

Regex re = new Regex(@"(\d+)"); 
Match result = re.Match("123456789"); 
Console.WriteLine(result.Groups[1000000000].Value); // works: "" 
Console.WriteLine(result.Groups[0].Value); // works: "123456789" 
Console.WriteLine(result.Groups[-1].Value); // works: "" 

명암이,

GroupCollection.Item Property (Int32) documentation는 예외를 throw하는 것은 아닙니다 그 이유 (들) GroupCollection는 예외없이 말도 안되는 소리를 처리하고 DataColumnCollection은 예외가있는 동일한 말도를 처리하지만, 나는 그것을 의심한다.

bool StringContains(string inString, string lookForString) 
{ 
    if (inString.IsNullOrEmpty) 
     return false; 

    // blah 
} 

bool StringContains(string inString, string lookForString) 
{ 
    if (inString == null) 
     throw new ArgumentNullException("inString"); 
    if (inString.Length == 0) 
     throw new ArgumentException("inString cannot be empty."); 

    // blah 
}