包含三段的 C# 拆分字符串

本文关键字:拆分 字符串 包含三 | 更新日期: 2023-09-27 18:26:18

大家好,几个小时前我问过这个问题 C# 从字符串中获取用户名。 斯普利特

现在我有难题。试图从这个字符串中获取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(

坦克

包含三段的 C# 拆分字符串

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

使用 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();
}

正则表达式的语法细分如下:

[^''"]+

表示,直到我们点击双引号 ("(

''">

表示将引号作为字符串的下一部分,因为前一项将我们带到它,但不会超过它。

([^<]+(<</p>

括号表示我们对这部分的结果感兴趣,我们将寻找直到我们达到小于 (<(。 由于这是我们希望提取的第一个"组",因此在比赛中称为组[1]。我们再次拥有我们正在寻找的角色来消费它并继续我们的搜索。

<[^''"]+''">

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

([A-Za-z0-9]+(

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

[^''"]+''">

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

与''">

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

([A-Za-z0-9]+(

同上,返回字母数字作为我们的组[3],并带括号

''">

用最后一句话结束。

希望这能解释它。谷歌搜索"正则表达式备忘单"对于记住这些规则非常有用。

应该非常容易解析。 我认出是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("'"", "");
    }

就个人而言,我会使用正则表达式。