Как сопоставить несколько шаблонов с регулярным выражением в C ++ 11 - PullRequest
0 голосов
/ 03 марта 2019

Предположим, есть строка с именем path, которая должна соответствовать нескольким шаблонам.Строка регулярного выражения имеет следующий вид:

std::string regexString="(/api/Attachment)|(/api/Attachment/upload)|(/api/Attachment/download)|(/api/v1/ApiTest)|(/api/v1/ApiTest/get/[^/]*/[^/]*)|(/api/v1/ApiTest/[^/]*/List)";

Соответствующий код выглядит следующим образом:

std::smatch result;
if (std::regex_match(path, result, regexString))
{
    for (size_t i = 1; i < result.size(); i++)
    {
        /// Question: Is there any better way to find the sub-match index without using a loop?
        if (!result[i].matched)
            continue;
        if (result[i].str() == path)
        {
            std::cout<<"Match a pattern with index "<<i<<std::endl;
            /// Do something with it;
            break;
        }
     }
 }
 else
 {
     std::cout<<"Match none"<<std::endl;
 }

Вышеприведенная программа работает, но, учитывая большое количество шаблонов, цикл в ней работаетнемного некрасиво и неэффективно.Как показывают комментарии в коде, у меня вопрос, есть ли способ найти индекс суб-соответствия без использования циклов?

Любые комментарии будут высоко оценены, спасибо!

1 Ответ

0 голосов
/ 03 марта 2019

Попробуйте использовать только одно чередование, которое охватывает все варианты.В схеме ниже я также отключаю захват в чередовании.Это оставляет нас с довольно простой логикой сопоставления.Если smatch результат имеет запись, то это должна быть одна запись со всем соответствующим путем.В противном случае он должен быть пустым.

std::string regexString="/api/(?:Attachment|Attachment/upload|Attachment/download|v1/ApiTest|v1/ApiTest/get/[^/]*/[^/]*|v1/ApiTest/[^/]*/List)";
std::string s ("/api/Attachment/upload");
std::regex e (regexString);

std::smatch sm;
std::regex_match (s,sm,e);

if (sm.size() > 0) {
    std::cout << "found a matching path: " << sm[0];
}

found a matching path: /api/Attachment/upload
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...