使用正则表达式解析输入:将字符串分为命令和args

时间:2013-05-10 14:22:00

标签: regex parsing command

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

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

Hallo!

- 不应该触发任何特殊的

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

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

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

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

我知道,我应该使用正则表达式,但是,我有点坚持这个问题。 任何人都可以帮助我吗?

2 个答案:

答案 0 :(得分:0)

通常,尽量不要使用regexp进行解析。请参阅http://kore-nordmann.de/blog/do_NOT_parse_using_regexp.htmlBuilding a Regex Based Parser

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

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

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

请注意,捕获可变数量的组(您的参数列表)可能会非常棘手。见Regular expression with variable number of groups?

答案 1 :(得分:0)

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

如果您使用的是Java,则以下代码可以正常运行。 (你需要拆分的第一个匹配组,因为它将包含命令和第一个arg)

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

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

INPUT: tell hello there! are you ready

输出:

  tell hello 
  there!
  are
  you
  ready

希望这有帮助!