С ++ оптимизировать код с помощью регулярных выражений - PullRequest
0 голосов
/ 21 апреля 2020

У меня есть следующий код для разбора различных макросов в тексте, но он работает медленно ...

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);

Можно ли написать регулярное выражение для разбора только в одной функции, то есть разбирать все макросы, которые мне нужны одновременно?

...