0

我目前正在开发基于多人的游戏。聊天不仅应该用于对话,还应该充当服务器命令行。

如果解析器接收到包含某些关键字的聊天输入,则应该将其视为命令 fe:

Hallo!

- 不应触发任何特殊情况

kick SomePlayer
tell Hey people, welcome to our server!
someotherCommand followed by multiple arguments

- 它们都应该被解析器捕获

如果找到某个命令(意味着其中一个关键字匹配),则应该在此标记之后划分字符串:

变量“command”应该包含关键字(fe kick)。数组“args”应该包含除以空格的所有后续单词。

我知道,我应该为此使用正则表达式,但是,我有点卡在这个问题上。谁能帮我?

4

2 回答 2

0

一般来说,尽量不要使用正则表达式进行解析。请参阅http://kore-nordmann.de/blog/do_NOT_parse_using_regexp.html构建基于正则表达式的解析器

也就是说,在命令前面加上特殊字符可以避免一些麻烦(“/kick SomePlayer”)。否则,您需要将输入解析为标记(大概由空格分隔)并检查第一个标记是否是关键字(“kick”)。如果你想要一个正则表达式,它就像

([^\s]+) (.*)

(假设您的正则表达式引擎识别“\s”;如果不是,您可以在方括号内的“^”之后使用“”或“\t”)。这将捕获第 1 组中的第一个单词和第 2 组中的其余单词(第 0 组将是完整匹配,这里可能是完整行)。

请注意,捕获可变数量的组(您的参数列表)可能很棘手。请参阅具有可变组数的正则表达式?

于 2013-05-10T14:32:26.033 回答
0

我认为你可以使用正则表达式(tell|kick)?\s+([^\s]+)*

如果您使用的是 Java,则以下代码有效。(您必须拆分的第一个匹配组,因为它将包含命令和第一个参数)

     Pattern patter=Pattern.compile("(tell|kick)?\\s+([^\\s]+)*");

      Matcher matcher=patter.matcher(s);
      while(matcher.find())
      {
          System.out.println(matcher.group());
      }

输入: tell hello there! are you ready

输出:

  tell hello 
  there!
  are
  you
  ready

希望这可以帮助!

于 2013-05-10T14:57:03.170 回答