我目前正在开发一款基于多人游戏的游戏。聊天不仅应该用于对话,还应该像服务器命令行一样。
如果解析器收到包含某些关键词的聊天输入,则应将其视为命令,例如:
Hallo!
- 不应该触发任何特殊的
kick SomePlayer
tell Hey people, welcome to our server!
someotherCommand followed by multiple arguments
- 它们都应该被解析器捕获
如果找到某个命令(意味着其中一个关键字匹配),则应该在该标记之后划分字符串:
变量“command”应包含关键字(f.e. kick)。 数组“args”应该包含所有后面的单词除以空格。
我知道,我应该使用正则表达式,但是,我有点坚持这个问题。 任何人都可以帮助我吗?
答案 0 :(得分:0)
通常,尽量不要使用regexp进行解析。请参阅http://kore-nordmann.de/blog/do_NOT_parse_using_regexp.html和Building 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
希望这有帮助!