C#RCon - 替换随机数量的空格?

时间:2012-07-21 22:34:35

标签: c# regex random split spaces

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

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

2 个答案:

答案 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?"));