我正在为Crysis Wars进行我的第一次公共服务器修改,并确保没有人窃取我的代码,我在尽可能多地放入基于C ++的DLL(替代方案是Lua)。为此,我必须在DLL中放置命令,其中一些命令需要额外的变量。 这是一个例子:
!ban [playername] [time] [reason]
如何检索变量播放器名称,时间和原因,所有这些变量都有不同的字符长度?原因变量也可能包含多个单词(例如'冒犯性消息和作弊'),需要提取。
在Lua中,这将使用简单的'string.match'完成;我想我总是可以在Lua中进行消息排序然后让它发送回C ++,但这可能导致整个chatcommand系统被解除组织。
需要从'const char * msg'中提取变量,系统会根据发送的每条消息对其进行分析。我已经分析了命令消息(以'!'开头的那些消息)。 这样做的最佳方式是什么?
的实施例 的 !ban Con 5垃圾邮件 - 这将激活玩家'Confl!ct'(我已经有部分扫描码来识别部分名称),持续五分钟
!禁止垃圾邮件 - 这将永久禁止播放器'Confl!ct'
答案 0 :(得分:0)
这里的方法是使用正则表达式,又名正则表达式。 当我查看我的旧问题,让它们变得更聪明时,我很快就使用txt2re来制作快速的正则表达式配方,如下所示:
#include <stdlib.h>
#include <string>
#include <iostream>
#include <pme.h>
int main()
{
std::string txt="!ban command variables";
std::string re1=".*?"; // Non-greedy match on filler
std::string re2="((?:[a-z][a-z]+))"; // Word 1
std::string re3=".*?"; // Non-greedy match on filler
std::string re4="((?:[a-z][a-z]+))"; // Word 2
std::string re5=".*?"; // Non-greedy match on filler
std::string re6="((?:[a-z][a-z]+))"; // Word 3
PME re(re1+re2+re3+re4+re5+re6,"gims");
int n;
if ((n=re.match(txt))>0)
{
std::string word1=re[1].c_str();
std::string word2=re[2].c_str();
std::string word3=re[3].c_str();
std::cout << "("<<word1<<")"<<"("<<word2<<")"<<"("<<word3<<")"<< std::endl;
}
}
此代码需要这些库,因为C ++默认情况下不包含正则表达式函数: