我目前遇到了RCon的问题 我基本上发送请求以获得所有玩家的列表 服务器回答所有玩家的列表,如下所示:
# IP:Port Ping ID Name
0 127.0.0.1 0 3523523 Bob
12 192.168.0.1 120 342525523 Anna
320 192.168.0.2 240 63463634634 Chuck Norris
^^^ ^^ ^^^^^ ^
问题是,我不知道不同标签之间有多少空格,这取决于#/ IP / ping和ID的长度。
空间可以从1个空间到5个空格不等
名称中也可以有空格,所以我不能只用一个空格分割。
我想从列表中读取IP,ping,ID和名称 我目前正试着做一些凌乱的替换&分开的东西,但是当空间不同时,它就无法解决 我想用正则表达式做一些事情,但我对正则表达式不太满意 我已将线条分割成1行 类Player可以存储所有信息
以下是应该发生的事情:
// List to store all the players
List<Player> players = new List<Player>();
// Using a StringReader to split up every line
StringReader reader = new StringReader(result);
string line;
int row = 0;
// Processing every line one after another
while ((line = reader.ReadLine()) != null)
{
row++;
// Doing some filtering to prevent empty lines and other stuff
if (row > 3 && !line.StartsWith("(") && line.Length > 0)
{
// Getting all the stuff I need here
// Then adding a player object to save the informations, ignore status
players.Add(new Player(ip, ping, id, name, status));
}
}
任何人都有想法可以解决这个问题吗?
答案 0 :(得分:4)
我想从列表中读取IP,ping,id和名称。
我很少这么说但是......这听起来像是正则表达式的工作。如果你现在不擅长这些,请以此为契机学习:)
使用正则表达式匹配所有内容,捕获组中的每个值,然后再获取组。
示例代码:
using System;
using System.IO;
using System.Linq;
using System.Text.RegularExpressions;
class Test
{
static void Main()
{
var regex = new Regex(@"^(?:\d+)\s+(?<ip>[\d.]+)\s+(?<ping>\d+)\s+(?<id>\d+)\s+(?<name>.*)$");
var query = File.ReadLines("data.txt")
.Skip(1)
.Select(line => regex.Match(line))
.Select(match => new {
IP = match.Groups["ip"].Value,
Ping = match.Groups["ping"].Value,
Id = match.Groups["id"].Value,
Name = match.Groups["name"].Value
});
foreach (var entry in query)
{
Console.WriteLine(entry);
}
}
}
示例输出:
{ IP = 127.0.0.1, Ping = 0, Id = 3523523, Name = Bob }
{ IP = 192.168.0.1, Ping = 120, Id = 342525523, Name = Anna }
{ IP = 192.168.0.2, Ping = 240, Id = 63463634634, Name = Chuck Norris }
显然你可以解析ping,IP地址等文本。这只是为了让你入门。 (另外,你应该检查一下比赛是否成功......)
答案 1 :(得分:1)
最简单的方法是将line
分成5部分
var items = line.Split(new char[] {' '}, 5, StringSplitOptions.RemoveEmptyEntries);
players.Add(new Player(items[1], items[2], items[3], items[4], "status?"));