У меня есть следующий код для разбора различных макросов в тексте, но он работает медленно ...
auto getDataMacroses = [](const std::string& string) -> std::vector<Data> {
std::vector<Data> macrosesData;
static const boost::regex macroPattern("\\${(?<uri>\\w+)\\.(?<id>\\w+)}");
auto macrosesBegin = boost::sregex_iterator(string.begin(), string.end(), macroPattern);
auto macrosesEnd = boost::sregex_iterator();
for (auto it = macrosesBegin; it != macrosesEnd; ++it) {
boost::smatch match = *it;
Data data;
data.uri = match["uri"];
data.id = match["id"];
data.position = match.position();
data.len = match.length();
macrosesData.push_back(std::move(data));
}
return macrosesData;
};
getUserMacroses = [](const std::string& string) -> std::vector<User> {
std::vector<User> macrosesUser;
static const boost::regex macroPattern("\\${(?<name>\\w+)}");
auto macrosesBegin = boost::sregex_iterator(string.begin(), string.end(), macroPattern);
auto macrosesEnd = boost::sregex_iterator();
for (auto it = macrosesBegin; it != macrosesEnd; ++it) {
boost::smatch match = *it;
if (match["name"] == "first_name") {
macrosesUser.push_back({ User::Type::FIRST_NAME, match.position() });
}
if (match["name"] == "last_name") {
macrosesUser.push_back({ User::Type::LAST_NAME, match.position() });
}
}
return macroses;
};
// Usage double parsing... I'd like parsing all the macroses for one time
std::string text = "Hello ${first_name} ${last_name}, you have permission for ${permissions.1234}. ${first_name} please check it right now.";
std::vector<Data> commonData = getDataMacroses(text);
std::vector<User> userData = getUserMacroses(text);
Можно ли написать регулярное выражение для разбора только в одной функции, то есть разбирать все макросы, которые мне нужны одновременно?