【问题标题】:Getting Game Score (Sub String) From String C#从字符串 C# 获取游戏分数(子字符串)
【发布时间】:2017-08-26 22:58:43
【问题描述】:

从字符串变量中提取分数的最佳方法是什么。例如从“Match One 2-1 To Red Team”中提取 2-1。

我打算在乐谱周围添加特殊字符并执行类似的操作

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;

【问题讨论】:

  • 总是2-1吗?
  • 格式是“匹配 [Some Number Word] x-y To [Red or some other color] Team”吗?
  • 它总是一个字符串,然后是分数,然后是更多的文本。我清理了使用的示例。
  • string out = in.Split()[2].Split('-')[1]; 我假设分数将是短语中的第三个单词。如果有点涉及,您可能必须使用正则表达式在短语中查找分数模式。
  • 我已经用我想出的方法更新了 OP,但它不是很优雅。字符串的一个确切示例是“伊甸园 100-95 至上要塞”

标签: c# string split substring


【解决方案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);

问题是你需要一些东西来识别分数。如果你使用'-',你可能会因为'-'而分裂在错误的位置,例如以团队的名义。为避免这种情况,您必须使用特殊标识符(就像使用 | 一样)。

【讨论】:

  • 没有团队名称有任何特殊字符。这是一次性导入,我可以看到所有团队名称。
【解决方案2】:

根据您的布局,您的所有匹配结果似乎都将具有类似的布局,如下所示:

匹配 [count] [int]-[int] 到 [Color] 团队

如果是这种情况,那么一个简单的正则表达式应该能够识别字符串中的信息并将其提取为所需的格式(在您的情况下,按顺序排列具有两个值的数组)。

此链接应该为您提供有关从字符串中提取匹配项的更多信息:

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...

可以推断出比赛号码,但那是另一回事了。如果数据以这种方式存储,那么访问数据将是一件非常简单的事情。

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:
      var splitScores = values[0].ToLower().Trim().Split('-');
      
      var leftScore  = Regex.Match(splitScores[0], @"\d+").Value;
      var rightScore = Regex.Match(splitScores[1], @"\d+").Value;
      

      上面的代码对我有用,所以我要把它标记为答案。感谢那些帮助过的人。

      【讨论】:

      • 这是一个不优雅的解决方案。如果您有相同模式的多个实例,则 Matches() 方法是一种更好的方法,并且易于扩展,但这是有限的。请参阅我上面的答案以查看文档。
      猜你喜欢
      • 2011-05-25
      • 2011-11-05
      • 2011-12-27
      • 1970-01-01
      • 2012-01-26
      • 1970-01-01
      相关资源
      最近更新 更多