C# - 从输出中获取特定文本

本文关键字:文本 获取 输出 | 更新日期: 2023-09-27 18:34:40

我有一个服务器包装器,它基本上从控制台获取输出并为我的世界提供额外的功能。

旁边有一个玩家列表,我希望列表显示连接的玩家。

Here is the output for a player Joining:
2012-05-17 17:56:32 [INFO] name [/192.168.0.16:50719] logged in with entity id 1873 at ([world] -34.8881557254211, 63.0, 271.69999998807907)
Output for player leaving:
2012-05-17 17:58:03 [INFO] name lost connection: disconnect.quitting

如何在加入时将玩家添加到列表中,并在退出时删除玩家?

任何帮助都会很棒,谢谢。

C# - 从输出中获取特定文本

有点笨拙,但这应该有效:

var input = "2012-05-17 17:56:32 [INFO] name [/192.168.0.16:50719] logged in with entity id 1873 at ([world] -34.8881557254211, 63.0, 271.69999998807907)";
var name = Regex.Matches(input, @"']'s(.+?)'s")[0].Groups[1].Value;

更多的部分答案:

假设您只是解析控制台输出并相应地响应消息 - 您不能只解析字符串以查看它是否包含某个短语,例如"登录"和"断开连接"?您可以使用正则表达式从字符串中获取所需的令牌,以从消息中构建对象。我假设"名称"是玩家的名字 - 在这种情况下,您甚至可能不需要使用正则表达式 - 玩家可以在我的世界服务器上有重复的名字吗?

如果没有,那么您应该能够将此令牌用作字典的键,例如

Dictionary<string, playerObject>

这样,您可以将消息与列表中的对象相关联,例如

伪代码:

private void OnNewMessage(string message) 
{
   if(message.Contains("logged in")) 
   {
      // Build player object
      // some code here ... to parse the string
      // Add to player dictionary
      PlayerDict.Add(playerName, newPlayerObject);
   }
   else if(message.Contains("disconnect")) 
   {
      // Find the player object by parsing the string
      PlayerDict.Remove(playerName);
   }
}

你能提供更多关于你到目前为止所拥有的东西以及你正在用什么技术写这篇文章的信息吗?还有一些注意事项(因为您在标签中有列表框,我假设它是winforms(,例如绑定,并且根据所使用的技术,该方法可能会略有不同

你最好

将你的球员存储在字典(地图(中,然后你可以按名称添加和删除它们。

要捕获名称,您可以使用正则表达式,或者看起来您可能会从名称的位置开始获取子字符串,因为这看起来是一致的。

string name = outputString.Substring(27)

然后,您可以在一个空格上拆分,并在位置 0 处获取结果。

name = name.Split(' ')[0];