2017-04-01 4 views
-2

문자열 변수에서 점수를 추출하는 가장 좋은 방법은 무엇입니까? 예를 들어, "Match One 2-1에서 Red Team으로"에서 2-1을 추출하십시오. 문자열에서 게임 점수 받기 (하위 문자열) C#

나는이

string in = "Match One |2-1| To Red Team"; 
string out = input.Split('|', '|')[1]; 

같은 것을 점수 주위에 특수 문자를 추가 할 거라고하지만 나 CSV 파일의 행 수백 개의 문자를 추가 포함한다.

대시로 분리 할 수 ​​있습니까? 배열에 숫자를 어떻게 든 추출합니까?

scoreString.Split('-'); 

도움을 주시면 감사하겠습니다.

편집 :이 글을 쓰고 작동하지만 매우 깨끗해 보이지 않습니다.

var splitScores = values[0].ToLower().Trim().Split('-'); 

var leftScore = Regex.Match(splitScores[0], @"\d+").Value; 
var rightScore = Regex.Match(splitScores[1], @"\d+").Value; 
+0

항상 2-1로 바뀌고 있습니까? – Sajeetharan

+0

"일부 [숫자 단어] x-y [빨강 색 또는 다른 색] 팀과 일치합니까?" – Sweeper

+0

항상 그 다음에 문자열이되고 그 다음에 점수가 나오고 더 많은 텍스트가 될 것입니다.나는 사용 된 예제를 정리했다. –

답변

-1
var splitScores = values[0].ToLower().Trim().Split('-'); 

var leftScore = Regex.Match(splitScores[0], @"\d+").Value; 
var rightScore = Regex.Match(splitScores[1], @"\d+").Value; 

위의 코드는 나를 위해 작동하므로 위의 코드는 대답으로 표시됩니다. 도와 주신 분들께 감사드립니다.

+0

이것은 부끄럽지 않은 해결책입니다. 동일한 패턴의 인스턴스가 여러 개있는 경우 Matches() 메서드를 사용하면 더 좋은 방법이며 쉽게 확장 할 수 있습니다. 설명서를 보려면 위의 내 대답을 참조하십시오. – GKnight

1

당신은 같은 것을 할 수있는 :

if(splitScores.Length != 2 || !int.TryParse(splitScores[0].Split().Last(), var leftScore) || !int.TryParse(splitScores[1].Split().First(), var rightScore) 
    throw new Exception("Invalid input file); 

을 문제는 당신이 점수를 식별하기 위해 뭔가를해야 할 것입니다. '-'를 사용하면 '-'등의 이유로 잘못된 위치에서 분리 될 수 있습니다. 팀 이름으로. 이를 피하기 위해 (특별한 경우와 마찬가지로) 특별한 식별자를 사용해야합니다.

를 [INT]으로 [색상] 팀 -

일치 [수] [INT] : 레이아웃으로

+0

팀 이름에는 특수 문자가 없습니다. 이것은 일회성 가져 오기이며 모든 팀 이름을 볼 수 있습니다. –

1

, 다음과 같이 모든 경기 결과는 비슷한 레이아웃이 될 것으로 보인다

이 경우 간단한 정규 표현식을 사용하여 문자열의 정보를 원하는 형식 (사용자의 경우 2 개의 값이있는 배열)으로 식별하고 추출 할 수 있어야합니다.

이 링크는 문자열에서 일치를 당기에 대해 좀 더 많은 정보를 얻을해야합니다

C# Documentation - Regex.Matches

그러나, 여기에 무슨 일이 일어나고 있는지와 더 중요한 문제가있다. 데이터는 현재 데이터와 프리젠 테이션을 혼합하는 방식으로 저장되며, 이는 문자열 처리로 인해 싸우는 이유입니다.

Match_number,Winner,Winner_Score,Loser_score 
1,Red,2,1 
2,Blue,3,2 
3,Red,4,1 
etc... 

경기 번호를 유추 할 수 있지만, 다른 시간 문제이다 : 다음과 같이 CSV 파일을 구현하기 위해 더 좋을 것이다. 데이터가 이런 방식으로 저장 되었다면 데이터에 액세스하는 것은 매우 간단한 일입니다.

0

https://regexone.com/references/csharp의 무료 서비스 코드가 귀하의 목적에 맞게 수정되었습니다.

var s = "Match One 2-1 To Red Team"; 
s = "Strongholds on Eden 100-95 Supremacy"; 

string pattern = @"(\d+)-(\d+)"; 
MatchCollection matches = Regex.Matches(s, pattern); 

// This will print the number of matches 
Console.WriteLine("{0} matches", matches.Count); 

foreach (Match match in matches) { 
    GroupCollection data = match.Groups; 
    // This will print the number of captured groups in this match 
    Console.WriteLine("{0} groups captured in {1}", data.Count, match.Value); 

    Console.WriteLine("score: " + data[1] + ", score2: " + data[2]); 

    // Each Group in the collection also has an Index and Length member, 
    // which stores where in the input string that the group was found. 
    Console.WriteLine("score found at[{0}, {1})", 
     data[1].Index, 
     data[1].Index + data[1].Length); 
}