std::regex_match не находит вхождений [дубликат]

135
15 марта 2022, 18:50
На этот вопрос уже дан ответ здесь:
Как получить доступ более чем к одной подстроке, найденной smatch() (1 ответ)
Закрыт 2 года назад.

Либо я чего-то не понимаю, либо библиотека работает не так как все.

В общем, хотел разбить одну строку на подстроки, где разделитель \r\n, но не тут то было...

Тесты регулярок:

(.+)\s+ ^(.+)$\s+ (.+)$\s+

Какое выражение нужно std::regex что бы ему стало понятно что нужно разделить строки через разделители строк?

Воспроизводимый пример:

#include <iostream>
#include <regex>
#include <string>
int main()
{
    std::string match_string =
    {
        "GET / HTTP/1.1\r\n"
        "Host: 127.0.0.1\r\n"
        "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:72.0) Gecko/20100101 Firefox/72.0\r\n"
        "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8\r\n"
        "Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3\r\n"
        "Accept-Encoding: gzip, deflate\r\n"
        "DNT: 1\r\n"
        "Connection: keep-alive\r\n"
        "Upgrade-Insecure-Requests: 1\r\n"
        "\r\n"
    };
    std::regex split_lines {"(.+)\\s+"};
    std::smatch results;
    if(std::regex_match(match_string, results, split_lines))
    {
        std::cout << "Found: " << results.size() << std::endl;
    }
    return 0;
}
Answer 1

Попробуйте так:

int main(int argc, char * argv[])
{
    string match_string =
    {
        "GET / HTTP/1.1\r\n"
        "Host: 127.0.0.1\r\n"
        "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:72.0) Gecko/20100101 Firefox/72.0\r\n"
        "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8\r\n"
        "Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3\r\n"
        "Accept-Encoding: gzip, deflate\r\n"
        "DNT: 1\r\n"
        "Connection: keep-alive\r\n"
        "Upgrade-Insecure-Requests: 1\r\n"
        "\r\n"
    };
    std::regex split_lines{R"=((.+)\s+)="};
    std::smatch results;
    while(regex_search(match_string, results, split_lines))
    {
        std::cout << results.str() << '\n';
        match_string = results.suffix();
    }
}
READ ALSO
Как моргать светодиодами без delay()?

Как моргать светодиодами без delay()?

Есть 4 светодиодаМне надо чтобы 1 светодиод горел 8 секунд, а остальные 3 по 500 миллисекунд

145
Как в массиве найти некое количество наибольший или наименьших значений

Как в массиве найти некое количество наибольший или наименьших значений

Как найти и вывести на экран, например, три максимальных или минимальных элемента массива, на языке программирования "Си"? Например массив,

145
#1111 - Invalid use of group function

#1111 - Invalid use of group function

Пытаюсь выполнить запросЗапрос должен полю users

140