2013-09-25 49 views
2

我正在爲Crysis Wars做我的第一個公共服務器修改,並確保沒有人竊取我的代碼,我儘可能地在基於C++的DLL(替代方案是Lua)中放置。爲此,我必須將命令放入DLL中,其中一些需要額外的變量。 下面是一個例子:從郵件中檢索字符串

禁止[playername] [時間] [原因]

我怎麼會去檢索變量playername,時間及原因,都具有不同的字符長度?原因變量也可能有多個單詞(如'冒犯性消息和欺騙'),需要提取。

在Lua中,這將通過一個簡單的'string.match'來完成;我想我總是可以在Lua中進行消息排序,然後將其發送回C++,但這可能導致整個聊天系統被解散。

它需要從'const char * msg'中提取變量,該變量由系統在發送的每條消息上進行分析。我已經分析過它的命令消息(那些以'!'開頭的消息)。 這樣做的最好方法是什麼?

例子: 禁令精讀5的垃圾郵件 - 這將踢球員的Confl CT!「(我已經有部分掃描代碼來識別部分名稱)五分鐘

! !禁令精讀垃圾 - 這將永久禁止玩家!Confl CT'

+0

「我怎麼會去重處理變量球員名稱,時間和理由「我不明白。請用不同的語言再提問。 –

+0

我該如何使用string :: match或類似的方法從chatmessage中提取這些變量。我會用信息更新原始帖子。 謝謝指出! :) – cybermonkey

+0

如果遊戲使用Lua進行腳本編寫,爲什麼你會在乎任何人試圖'竊取'你的代碼?你正在做的是爲控制檯命令做一個包裝(從我可以看到的)。 – 2013-09-25 17:58:07

回答

0

去這裏的方式是使用正則表達式,又名正則表達式。 當我正在經歷我的老問題,smartening起來,我趕緊用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++不包括正則表達式功能默認爲: