Я делаю свою первую публичную модификацию сервера для Crysis Wars и, чтобы никто не крал мой код, я помещаю как можно больше в DLL на основе C ++ (альтернатива — Lua). Для этого я должен поместить команды в DLL, некоторые из которых требуют дополнительных переменных.
Вот пример:
!бан [имя игрока] [время] [причина]
Как мне найти переменные имя игрока, время и причину, каждая из которых имеет разную длину символов? Переменная причины также может содержать более одного слова (например, «оскорбительные сообщения и мошенничество»), которое необходимо будет подобрать.
В Lua это будет сделано с помощью простого string.match; Я полагаю, что я всегда мог бы выполнить сортировку сообщений в Lua, а затем заставить их отправлять обратно в C ++, но это может привести к дезорганизации всей системы командных команд.
Потребуется извлечь переменные из ‘const char * msg’, который анализируется системой при каждом отправленном сообщении. Я уже анализирую это для командных сообщений (те, которые начинаются с ‘!’).
Каков наилучший способ сделать это?
Примеры:
!запретить Con 5 спам— Это ударит игрока «Confl! Ct» (у меня уже есть код частичного сканирования для идентификации частичных имен) на пять минут.
!запретить спам— Это навсегда забанит игрока ‘Confl! Ct’
Путь здесь заключается в использовании регулярных выражений, иначе регулярное выражение.
По мере того, как я разбирался со своими старыми вопросами, разбирал их, я быстро использовал 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 ++ по умолчанию не включает функцию регулярных выражений:
Других решений пока нет …