2012-02-29 72 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。