2012-02-29 69 views
1

大家好我几个小时前问这个问题C# get username from string. splitC#分割字符串三块

现在我有困难的问题。试图从这个字符串

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

得到AcidPlayerm249我想这

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)

坦克

回答

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

为正则表达式语法击穿是这样的:

[^ \“] +

手段,去,直到我们打双引号(“)

\”

意味着把引号作为字符串的下一个部分,因为上一届带给我们它,但不会超过它。

([^ <] +)<

括号意味着我们感兴趣的是这一部分的结果,我们将寻求直到我们打了不到(<)。因为这是我们想要提取的第一个“组”,所以在比赛中它被称为组[1]。我们再次拥有我们正在寻找的角色来消费它并继续我们的搜索。

< [^ \“] + \”封杀\”

这将再次搜索,不保持结果由于没有括号,直到我们打了下一个引号。然后我们手动指定的( “封杀”),因为我们感兴趣的是后有什么字符串。

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

这将封顶确保我们的Group [2]结果的任何字符是字母数字,大写或小写字母。

[^ \ “] + \”

搜索而忽略其他,直到我们打了下一个双引号

与\”

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

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

与上述相同,返回字母数字作为我们的组[3]与括号

\”

完它与最后的报价。

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

+0

好的,非常感谢你的工作。但是你从哪里得到这个正则表达式?你知道这个或它是由电脑产生的吗? – 2012-02-29 02:00:04

+0

我会用更多关于正则表达式的细节来更新答案。我根据你的字符串编写它。 – Developer 2012-02-29 02:04:49

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。