从Messages中检索字符串

时间:2013-09-25 17:51:01

标签: c++ string crysis

我正在为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'

1 个答案:

答案 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 ++默认情况下不包含正则表达式函数: