Получение регулярного поиска в С++

Здравствуйте, я новичок в регулярных выражениях и из того, что я понял из справочного сайта С++, можно получить результаты матчей.

Мой вопрос: как получить эти результаты? В чем разница между smatch и cmatch? Например, у меня есть строка, состоящая из даты и времени, и это регулярное выражение, которое я написал:

"(1[0-2]|0?[1-9])([:][0-5][0-9])?(am|pm)"

Теперь, когда я делаю regex_search со строкой и указанным выше выражением, я могу найти, есть ли время в строке или нет. Но я хочу сохранить это время в структуре, чтобы я мог разделить часы и минуты. Я использую Visual Studio 2010 С++.

Ответ 1

Если вы используете, например, std::regex_search, то он заполняет std::match_result, где вы можете использовать operator[], чтобы получить согласованные строки.

Изменить: Пример программы:

#include <iostream>
#include <string>
#include <regex>

void test_regex_search(const std::string& input)
{
    std::regex rgx("((1[0-2])|(0?[1-9])):([0-5][0-9])((am)|(pm))");
    std::smatch match;

    if (std::regex_search(input.begin(), input.end(), match, rgx))
    {
        std::cout << "Match\n";

        //for (auto m : match)
        //  std::cout << "  submatch " << m << '\n';

        std::cout << "match[1] = " << match[1] << '\n';
        std::cout << "match[4] = " << match[4] << '\n';
        std::cout << "match[5] = " << match[5] << '\n';
    }
    else
        std::cout << "No match\n";
}

int main()
{
    const std::string time1 = "9:45pm";
    const std::string time2 = "11:53am";

    test_regex_search(time1);
    test_regex_search(time2);
}

Выход из программы:

Match
match[1] = 9
match[4] = 45
match[5] = pm
Match
match[1] = 11
match[4] = 53
match[5] = am

Ответ 2

Просто используйте именованные группы.

(?<hour>(1[0-2]|0?[1-9]))([:](?<minute>[0-5][0-9]))?(am|pm)

Хорошо, vs2010 не поддерживает именованные группы. Вы уже используете неназванные группы захвата. Пройдите через них.