2011-09-17 3 views
1

난이 (내 작성한 Readline) 같은 문자열을 가지고 :C#에서 하위 문자열 뒤에 나머지 문자열을 잘라내는 방법은 무엇입니까?

알파 : 10662 베타 : -64 가마 : 70,679 델타 : 1001 난 매개 변수로이 번호의 일부를 사용할 필요가

하지만, 이 수는 다양한 길이를 가질 수 있습니다. 나는 추출 값 알파 내가 함께 할 수있는 것을 상상할 수 : 베타 및 알파의 값이 다를 수 있습니다 경우

str1 = readline.Substring(6, 5); 

그러나이 어떻게 감마의 값을 얻을 것인가?

+0

정규 표현식을 사용하고 값을 일치 항목으로 추출하는 것이 좋습니다. –

답변

4

당신은 모든 name:value쌍과 일치하는 이름과 값을 추출 캡처 그룹을 사용하는 정규식을 사용할 수 있습니다

var readline = "alpha: 10662 beta: -64 gamma: 70679 delta: 1001"; 
var matches = Regex.Matches(readline, @"(?<parameter>\w*):\s*(?<value>-?\d*)"); 
var dictionary = new Dictionary<string,int>(); 
foreach (Match m in matches) 
{ 
    dictionary.Add(m.Groups["parameter"].Value,int.Parse(m.Groups["value"].Value)); 
} 
Console.WriteLine(dictionary["gamma"]); // output: 70679 
+0

+1 내 자신에 비해 우수한 정규식 기술을 가지고 있습니다. –

+0

필요한 정확한 값을 추출하려면 캡처 그룹이 필요합니다. – ChaosPandion

+0

캡쳐 그룹을 정규식에 추가했습니다. –

2

나는 그것을 문자열을 사용하는 다른 방법을하고 가겠어요. 먼저 분리자를 분리하여 짝수 위치의 키와 홀수 위치의 값으로 키/값의 배열을 생성합니다. 그런 다음 원하는 키와 연관된 값을 2로 선택하여 배열을 반복하거나 항상 동일한 순서로 있으면 변환 할 올바른 배열 요소를 선택하면됩니다.

손상된 입력이 없는지 확인하기 위해 입력 유효성 검사를 적용하십시오.

var parameters = line.Split(new [] { ':', ' ' }, StringSplitOptions.RemoveEmptyEntries); 

for (var i = 0; i < parameters.Length; i += 2) 
{ 
    var key = parameters[i]; 
    var value = int.Parse(parameters[i+1]); 

    // do something with the value based on the key 
} 
+0

콜론에서 분할하는 것은 정규 표현식과 비교하여 흥미로운 접근 방법입니다. – JohnD

2

그것은 정규 표현식에 적합한 것 같아 :

var regex = new Regex(@"(\w+)\:\s(-?\d+)"); 
var values = from pair in regex.Matches("alfa: 10662 beta: -64 gama: 70679 delta: 1001").OfType<Match>() 
      select new { Key = pair.Groups[1].Value, pair.Groups[2].Value }; 
0

내가 이것에 대한 문자열을 사용하지 것이다; 좀더 장황하고 오류가 발생하기 쉽습니다.

가장 간단한 방법은 모든 데이터가 공백으로 구분되어있는 것처럼 보입니다. 이것은 공정한 가정입니까? 각 변수의 순서는 항상 동일합니까? 그렇다면 공백을 분리하고 다른 모든 숫자를 간단히 잡을 수 있습니다.

데이터가 항상 동일한 형식이 아닌 경우 대신 정규식을 사용합니다. 다음 형식 중 하나를 사용할 수 있습니다.

/alfa: ([+-]\d+)/ 

"alpha :"다음에 숫자가 표시됩니다. 당신은 부동 소수점 값을 위해 약간 더 멋진 것을 필요로 할 것입니다. 솔직히, 나는 매우 정규 표현식을 사용하는 경우는 거의 없으며, 정규 표현식을 쓸 때 정규 표현식 버디를 사용하므로 너무 길어질수록 포괄적 인 표현을 쓰고 싶지는 않다.

EDIT : Mark의 Regex가 내 것보다 훨씬 낫다.

관련 문제