2011-10-15 6 views
2

형식화 된 문자열 입력을 캡처하는 프로그램이 있습니다. 입력 내용은 다음과 같습니다.정규식, 세트의 숫자가 달라짐

{1, 2, 3, 4, 5, 6, 7} 

모두가 세트 안에있는 경우 숫자가 다를 수 있습니다. 예 :

{1, 2, 3} 
{1, 2, 3, 4} 

모두 유효합니다. 그러나 그 세트 내의 각 번호에 액세스 할 수 있어야합니다. 다음 코드가 있습니다

Match match = Regex.Match(input, @"\{(\d,\s)*(\d)\}", RegexOptions.IgnoreCase); 

if (match.Success) 
{ 
    String s; 

    for(int i = 0; i < match.Groups.Count; i++) 
    { 
     s = match.Groups[i].Value; 
     // Do actions here 
    } 
} 

일치하는 항목이 있지만 세트 내에서 마지막 번호와 마지막 번호 만 액세스 할 수 있습니다. 세트의 각 멤버에서 값을 읽을 수 있기를 바랍니다. 이 일을 어떻게 하죠? 정규식 이외의 다른 것이 더 잘 작동할까요?

답변

2

regex 이외의 것이 더 잘 작동할까요?

중괄호로 묶은 문자열을 캡처하는 데 정규 표현식이 가장 유용 할 수 있지만 단순한 명령형 코드를 사용하여 그 안에 숫자를 가져 오는 것이 더 쉽습니다.

정규식 \{([^\}]*)\}부터 시작하여 '{'로 시작하고 '}'로 끝나는 문자열의 내부 부분을 잡아낼 수 있습니다. 그런 다음 쉼표로 쪼개서 캡처를 처리하여 숫자를 가져 와서 필요하면 공백을 제거 할 수 있습니다.

+0

이 모든 정규 표현식에 악명 읽기 어려운 후, 이해하기 아마도 간단 접근 방식이다. 그러나 쉼표 사이의 각 항목이 실제로 숫자임을 개별적으로 확인해야하므로 복잡한 코드로 이어질 수도 있습니다. * 가능성이 * 물론 이것은 또한 검증되어야하지만 덜 효율적입니다. – DeCaf

+0

우리는 입력이 정수라고 가정합니다. 적어도 지금은 고맙게도 말입니다. 이것은 아름답게 작동하고 C#이 split() 함수와 함께 제공된다는 것을 알지 못했습니다! 감사합니다! – shmeeps

1

모든 캡처에 액세스하려면 GroupCaptures 속성에 액세스해야합니다.

for (int i = 0; i < match.Groups.Count; i++) 
{ 
    CaptureCollection caps = match.Groups[i].Captures; 
    foreach (Capture cap in caps) 
    { 
     Console.WriteLine(cap.Value); 
    } 
} 

또한, 당신은 당신이 쉼표 기호가 캡처의 일부가되고 싶지 않아 당신은 또한 하나의 숫자의 집합을 허용하려면 예를 "\{(\d)(?:,\s(\d))*\}"에 대한 귀하의 정규식을 변경할 수 있습니다.

0

이 시도 :

var Input = "{1, 2, 3, 4, 5, 6, 7} foo {1, 2, 3} baa {1, 2, 3, 4} abc"; 
var Pattern = "\\{([0-9, ]+)\\}"; 
var Matches = Regex.Matches(Input, Pattern, RegexOptions.IgnorePatternWhitespace); 
foreach (Match match in Matches) 
{ 
    string s = match.Groups[1].Value; // n1,n2,n3.. 
    //do actions here 

    /* 
    * if you need parse each element,use s.Split(','). 
    * For example 
    *  s is '1,2,3' 
    *  string[] parts = s.Split(','); 
    *  for(int x = 0,max = parts.Length; x < max; x++) { 
    *   Console.WriteLine(parts[x]); 
    *  } 
    *  
    *  the output is something like: 
    *  1 
    *  2 
    *  3 
    */ 

}