Получение поиска по регулярному выражению в C ++

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

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

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

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

 sashang16 окт. 2012 г., 08:14
все, что сделает поиск регулярных выражений, это скажет вам, где в строке существует подстрока, которая соответствует выражению регулярного выражения; в вашем случае подстрока - это дата и время. Затем вам нужно написать некоторый код для анализа этой подстроки и передачи данных из нее в структуру. регулярное выражение нене собираюсь волшебным образом сделать это для вас.
 RDismyname16 окт. 2012 г., 08:27
Но я думал, что регулярное выражение может хранить совпадения в объекте match_results?

Ответы на вопрос(2)

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

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

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

 RDismyname16 окт. 2012 г., 09:19
Эй, kuperspb спасибо! Эта статья помогла!
 kuperspb16 окт. 2012 г., 08:44
Хорошая статья для начала использования регулярных выражений tr1.codeguru.com/cpp/cpp/cpp_mfc/stl/article.php/c15339/...
 RDismyname16 окт. 2012 г., 08:41
извините, я не понимаю вашего ответа. Я новичок в регулярных выражениях и в основном то, что я хочу сделать, например, это с входной строкой "с 10 до 12 часов " Я хочу получить 10 утра в строковую переменную и 12 вечера в другую переменную. Я могу использовать поиск по регулярному выражению, чтобы узнать, есть ли у строки время, но как мне извлечь это время?
Решение Вопроса

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

Редактировать: Пример программы:

#include 
#include 
#include 

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);
}
 RDismyname16 окт. 2012 г., 08:22
Да, Joachim, но как мне узнать местоположение совпавшей строки в объекте smatch, который я создаю? например в строке "с 10 до 12 часов " как я могу хранить "10 часов утра" в переменной и "12 вечера» в другой переменной?
 Some programmer dude16 окт. 2012 г., 09:22
@RDismyname Добавил пример программы в мой ответ.

Ваш ответ на вопрос