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 スペースの範囲で指定できます。
また、名前にスペースが含まれている可能性があるため、1 つのスペースだけで分割することはできません。

リストから 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 に答える