This commit is contained in:
aozhiwei 2021-09-02 19:41:44 +08:00
parent 4e36966bab
commit 57447c94f5
3 changed files with 65 additions and 13 deletions

View File

@ -96,16 +96,34 @@ static void SavePerfLog()
bool App::Init(int argc, char* argv[])
{
#if 1
#if 0
{
std::string data = "";
std::string pattern = R"(\$\{.*\})";
std::regex re(pattern);
std::string data = "${master.name} [aa ]${image.id:1000} bb${}cc";
std::string pattern = R"(\$\{.*?\})";
std::regex re(pattern, std::regex_constants::ECMAScript);
std::cmatch m;
bool ret = std::regex_search(data.c_str(), m, re);
if (ret) {
a8::XPrintf("str:%s", {m.str()});
bool matched = true;
const char* last_pos = data.c_str();
const char* end_pos = data.c_str() + data.length();
while (last_pos < end_pos) {
matched = std::regex_search(last_pos, m, re);
if (matched) {
if (m.position() > 0) {
a8::XPrintf("raw_str:%s\n",
{std::string(last_pos, m.position())});
}
a8::XPrintf("str:%s pos:%d len:%d\n",
{m.str(),
m.position(),
m.length()});
last_pos += m.position() + m.length();
} else {
a8::XPrintf("raw_str2:%s\n",
{std::string(last_pos, end_pos - last_pos)});
last_pos = end_pos;
}
}
exit(1);

View File

@ -419,6 +419,7 @@ enum KillTextFieldIdx
kFieldIdxMasterName = 1000,
kFieldIdxKillerName,
kFieldIdxDeadName,
kFieldIdxWeaponName,
kFieldIdxWeaponTextIcon,
};

View File

@ -3,6 +3,8 @@
#include <unistd.h>
#include <fcntl.h>
#include <regex>
#include <a8/stringlist.h>
#include <a8/csvreader.h>
@ -19,15 +21,46 @@
a8::XValue(MetaMgr::Instance()->GetSysParamAsString(#field_name, def_val)).GetString();
static void ParseElemets(const std::string& text,
std::vector<std::tuple<int, std::string>>& elemets)
std::vector<std::tuple<int, std::string>>& elements)
{
const char* p = text.c_str();
int state = 0;
while (*p) {
if (*p == '$') {
auto parsevar_cb =
[] (const std::string& var_name, std::vector<std::tuple<int, std::string>>& elements)
{
if (var_name == "${master.name}") {
elements.push_back(std::make_tuple(kFieldIdxMasterName, ""));
} else if (var_name == "${killer.name}") {
elements.push_back(std::make_tuple(kFieldIdxKillerName, ""));
} else if (var_name == "${dead.name}") {
elements.push_back(std::make_tuple(kFieldIdxDeadName, ""));
} else if (var_name == "${weapon.name}") {
elements.push_back(std::make_tuple(kFieldIdxWeaponName, ""));
} else if (var_name == "${weapon.text_icon}") {
elements.push_back(std::make_tuple(kFieldIdxWeaponTextIcon, ""));
} else if (var_name.find("${image.id:") == 0) {
} else {
abort();
}
};
std::regex re(R"(\$\{.*?\})", std::regex_constants::ECMAScript);
const char* pcurr = text.c_str();
const char* pend = text.c_str() + text.length();
while (pcurr < pend) {
std::cmatch m;
if (std::regex_search(pcurr, m, re)) {
if (m.position() > 0) {
auto& e = a8::FastAppend(elements);
e = std::make_tuple(kTextElement, std::string(pcurr, m.position()));
}
parsevar_cb(m.str(), elements);
pcurr += m.position() + m.length();
} else {
auto& e = a8::FastAppend(elements);
e = std::make_tuple(kTextElement, std::string(pcurr, pend - pcurr));
pcurr = pend;
}
++p;
}
}