C#分裂字符串有三个部分

时间:2012-02-29 01:22:14

标签: c# string split substring

大家好几个小时前我问过这个问题C# get username from string. split

现在我遇到了困难。尝试从此字符串中获取Acid Playerm249

    L 02/28/2012 - 06:14:22: "Acid<1><VALVE_ID_PENDING><CT>" 
killed "Player<2><VALVE_ID_PENDING><TERRORIST>" with "m249"

我试过这个

int start = Data.ToString().IndexOf('"') + 1;
            int end = Data.ToString().IndexOf('<');
            var Killer = Data.ToString().Substring(start, end - start);

            int start1 = Data.ToString().IndexOf("killed") + 1;
            int end1 = Data.ToString().IndexOf('<') + 4;
            var Victim = Data.ToString().Substring(start1, end1 - start1);

但它在最后一行显示此例外

Length cannot be less than zero.
Parameter name: length

是否可以获得玩家名称和最后一个字符串(m249)

2 个答案:

答案 0 :(得分:4)

这是一个如何使用正则表达式执行此操作的简单示例。根据字符串的变化程度,这个可能适合你。我假设引号(“)和它们之间的文本是一致的。你需要在顶部添加这一行:

  

使用System.Text.RegularExpressions;

代码:

string input = "L 02/28/2012 - 06:14:22: \"Acid<1><VALVE_ID_PENDING><CT>\" killed \"Player<2><VALVE_ID_PENDING><TERRORIST>\" with \"m249\"";
Regex reg = new Regex("[^\"]+\"([^<]+)<[^\"]+\" killed \"([A-Za-z0-9]+)[^\"]+\" with \"([A-Za-z0-9]+)\"");
Match m = reg.Match(input);
if (m.Success)
{
    string player1 = m.Groups[1].ToString();
    string player2 = m.Groups[2].ToString();
    string weapon = m.Groups[3].ToString();
}

正则表达式的语法细分是:

  

[^ \“] +

意思是,直到我们达到双引号(“)

  

\“

表示将引号作为字符串的下一部分,因为上一个术语将我们带到了它,但是没有超过它。

  

([^&LT;] +)&LT;

括号表示我们对这部分的结果感兴趣,我们将寻求直到我们达到小于(&lt;)。因为这是我们想要提取的第一个“组”,所以在比赛中它被称为组[1]。我们再次使用我们正在搜索的角色来使用它并继续我们的搜索。

  

&lt; [^ \“] + \”杀死了\“

这将再次搜索,而不保留由于没有括号的结果,直到我们达到下一个引号。然后我们手动指定字符串(“已杀死”),因为我们对之后的内容感兴趣。

  

([A-ZA-Z0-9] +)

这将捕获我们的Group [2]结果的任何字符,这些字符是字母数字,大写或小写。

  

[^ \ “] + \”

搜索并忽略其余部分,直到我们点击下一个双引号

  

与\“

我们用作标记的另一个文字字符串

  

([A-ZA-Z0-9] +)

与上面相同,使用括号

返回字母数字作为我们的组[3]
  

\“

以最后一句话结束。

希望这可以解释它。谷歌的“正则表达式备忘单”对于记住这些规则非常有用。

答案 1 :(得分:2)

应该超级易于解析。我认识到这是CS。请在这里查看Valve的文档:

https://developer.valvesoftware.com/wiki/HL_Log_Standard#057._Kills

更新

如果你对正则表达式不满意,这个实现也会做你想要的,并且与你试图做的一致:

    public void Parse(string killLog)
    {
        string[] parts = killLog.Split(new[] { " killed ", " with " }, StringSplitOptions.None);
        string player1 = parts[0].Substring(1, parts[0].IndexOf('<') - 1);
        string player2 = parts[1].Substring(1, parts[1].IndexOf('<') - 1);
        string weapon = parts[2].Replace("\"", "");
    }

就个人而言,我会使用RegEx。