2017-04-01 63 views
-2

從字符串變量中提取得分的最佳方法是什麼?例如從「匹配2-1到紅隊」中提取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); 

的問題是,你需要的東西,以確定分數。如果您使用' - ',則可能會發生在錯誤的位置分割,因爲' - '例如以團隊名義。爲了避免這種情況,你必須使用一個特殊的標識符(就像你用的那樣)。

+0

沒有隊名有任何特殊字符。這是一次性導入,我可以看到所有的球隊名稱。 –

1

通過你的佈局,似乎所有的比賽結果將是一個類似的佈局如下:

匹配[計] [INT] - [INT]爲[顏色]隊

如果是這樣的話,那麼一個簡單的正則表達式應該能夠識別並從字符串中提取信息到所需的格式(在你的情況下,一個具有兩個值的數組)。

此鏈接應該讓你更多瞭解如何從字符串匹配拉:

C# Documentation - Regex.Matches

但是,什麼是怎麼回事更顯著的問題。數據目前以一種將數據與表示混合的方式進行存儲,這就是您爲處理字符串而戰的原因。這將是更好地執行CSV文件如下:

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

比賽數量可以推斷,但這是另外一個時間問題。如果數據以這種方式存儲,訪問數據將是一件非常簡單的事情。

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); 
}