【问题标题】:C# - Get specific text from outputC# - 从输出中获取特定文本
【发布时间】:2012-05-17 17:01:04
【问题描述】:

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

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

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

如何在加入时将播放器添加到列表中,并在退出时删除?

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

【问题讨论】:

  • 我试过分割文本,但过去我没有太多使用字符串。它只是失败了!
  • 为什么有一个 IP 的端口应该是玩家名?

标签: c# listbox split minecraft


【解决方案1】:

有点hacky,但这应该可以:

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;

【讨论】:

  • 人名中可以有空格吗?
  • 不,只有一个单词的用户名
【解决方案2】:

更多部分答案:

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

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

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),例如绑定,并且根据使用的技术,方法可能略有不同

【讨论】:

  • 感谢您的帮助,虽然我不太清楚如何使用它,但我并没有真正做过很多。多年来我一直在使用 VB.NET,我对 C# 有点陌生。
  • 就我而言,它们是相同的 :) 只是语法不同是大约 98% 的差异!到目前为止,您想发布您的“接收消息”代码吗?另外 - 使用他发布的 Dave Bishs 正则表达式 - 使用 Regex 类(System.Text.RegularExpressions 命名空间)并将字符串作为输入传递,这应该返回用户的名称
  • 是的,我只有 15 岁,我还没有学会所有东西,但我注意到了类似的语法,它只是 .NET 框架而已
  • 啊,你每天都会学到一些新东西——我确信我已经使用了大约一年,直到我意识到 System.IO.Path 可以帮助组合路径/文件名而不会弄乱用斜线等:)
  • 就像你说的,你每天都会学到一些东西——我刚刚学习了 System.IO.Path——我一直在使用 \\。掌心。
【解决方案3】:

您最好将玩家存储在字典(地图)中,然后您可以按名称添加和删除它们。

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

string name = outputString.Substring(27)

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

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

【讨论】:

  • 将此与 Charleh 的答案结合起来,几乎拥有您需要的所有代码。
  • 是的,假设消息格式没有改变,这应该可以正常工作 - 无需任何正则表达式。
猜你喜欢
  • 1970-01-01
  • 2021-10-10
  • 1970-01-01
  • 2015-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-08
  • 1970-01-01
相关资源
最近更新 更多