包含三段的 C# 拆分字符串
本文关键字:拆分 字符串 包含三 | 更新日期: 2023-09-27 18:26:18
大家好,几个小时前我问过这个问题 C# 从字符串中获取用户名。 斯普利特
现在我有难题。试图从这个字符串中获取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(
坦克
这是一个如何使用正则表达式执行此操作的简单示例。根据字符串的变化程度,这个可能适合您。我假设引号 ("( 以及它们之间的文本是一致的。您需要在顶部添加以下行:
使用 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("'"", "");
}
就个人而言,我会使用正则表达式。