0

我目前遇到了 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));
            }
        }

任何人都有一个可以解决这个问题的想法?

4

2 回答 2

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 地址等的文本。这只是为了让您入门。(另外,你可能应该检查比赛是否成功......)

于 2012-07-21T22:40:20.573 回答
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?"));
于 2012-07-21T23:25:27.983 回答