大家好我几个小时前问过这个问题C# get username from string. split
现在我遇到了难题。试图从这个字符串中获取 Acid
Player
和 m249
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)
坦克
最佳答案
这是一个简单的示例,说明如何使用正则表达式来完成此操作。根据字符串的变化程度,这个可能适合您。我假设引号 (") 以及它们之间的文本是一致的。您需要在顶部添加这一行:
Using 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();
}
正则表达式的语法分解是这样的:
[^\"]+
意思是,直到我们找到双引号 (")
\"
表示将引号作为字符串的下一部分,因为前一个术语将我们带到它,但不会超过它。
([^<]+)<
括号表示我们对这部分的结果感兴趣,我们将寻找直到找到小于号(<)。因为这是我们要提取的第一个“组”,所以它在比赛中被称为 Groups[1]。我们再次找到我们正在搜索的字符来使用它并继续我们的搜索。
<[^\"]+\" killed \"
这将再次搜索,由于没有括号而不会保留结果,直到我们点击下一个引号。然后我们手动指定 ("killed ") 的字符串,因为我们对后面的内容感兴趣。
([A-Za-z0-9]+)
这将为我们的 Group[2] 结果捕获字母数字、大写或小写的任何字符。
[^\"]+\"
搜索并忽略其余部分,直到我们找到下一个双引号
with \"
我们用作标记的另一个文字字符串
([A-Za-z0-9]+)
同上,返回带括号的字母数字作为我们的Group[3]
\"
以最后一句话结束。
希望这能解释它。谷歌搜索“正则表达式备忘单”对于记住这些规则非常有用。
关于C# 将字符串分成三部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9492320/