2017-04-01 102 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); 
}