编辑:我应该更好地表达这个问题。我不删除它,而是将其保留在这里以供其他人学习。
我已经研究了一段时间,我还没有找到另一篇回答这个问题的帖子。
我要拆分的列表如下所示:
0. Yersinia Pestis, 76561198010013870
1. CatharsisLtd., 76561198056110126
2. Nut~Taco, 76561198072105032
这是玩家姓名和 ID 号的列表。我正在尝试删除 x。从每一行的开头开始,,
就在 ID 号之前,这样我就得到了一个如下所示的列表:
Yersinia Pestis
76561198010013870
CatharsisLtd.
76561198056110126
Nut~Taco
76561198072105032
我以为我已经通过使用类似这样的方法找到了解决方案:
string [] split = strings .Split(new Char [] {',' , '\n' });
但这行不通,因为玩家可以拥有诸如“, .”之类的东西。和他们名字中的其他符号。我确定有一种方法可以做类似的事情
string splitter = i.ToString()+". ";
and then something like ", any17DigitNumber"
如有任何帮助,我将不胜感激,我完全不知道如何使它适用于所有场景。唯一不变的是 ID 的索引和长度。
最佳答案
也许是这样的:
public class Player
{
public int Index { get; set; }
public long Id { get; set; }
public string Name { get; set; }
public override string ToString()
{
return string.Format("Player(Index={0}, Id={1}, Name={2})", Index, Id, Name);
}
}
public static Player ParsePlayer(string line)
{
var dot = line.IndexOf(".");
var comma = line.LastIndexOf(",");
return
new Player
{
Index = int.Parse(line.Substring(0, dot).Trim()),
Id = long.Parse(line.Substring(comma + 1).Trim()),
Name = line.Substring(dot + 1, comma - (dot + 1)).Trim()
};
}
public static void Main()
{
var data = new[] {
"0. Yersinia Pestis, 76561198010013870",
"1. CatharsisLtd., 76561198056110126",
"2. Nut~Taco, 76561198072105032",
"3. Smith, John, 76561198072105033",
" 4.Allen, Paul,76561198072105034 "
};
var players = new List<Player>();
// parse
foreach (var line in data)
{
players.Add(ParsePlayer(line));
}
// check
foreach (var player in players)
{
Console.WriteLine(player);
}
}
可测试 here .
正如 Reddy 在评论中所建议的那样,您也可以尝试使用正则表达式和命名的捕获组:
public static Player ParsePlayer(string line)
{
var regex = new Regex(@"\s*(?<index>[0-9]+)\s*\.\s*(?<name>.+)\s*,\s*(?<id>[0-9]+)\s*");
var match = regex.Match(line);
return
new Player
{
Index = int.Parse(match.Groups["index"].Value),
Id = long.Parse(match.Groups["id"].Value),
Name = match.Groups["name"].Value
};
}
可测试 here .
'希望这有帮助。
关于c# - 如何拆分具有多个分隔符的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40066596/