Это своего рода продолжение предыдущего вопроса SO и его обсуждение.
Разное Между std :: regex_match и std :: regex_search
В моем вопросе SO было написано следующее регулярное выражение для получения дня из данной входной строки:
std::string input{ "Mon Nov 25 20:54:36 2013" };
//Day:: Exactly Two Number surrounded by spaces in both side
std::regex r{R"(\s\d{2}\s)"};
В одном из ответов он был изменен как R"(.*?\s(\d{2})\s.*)"
Для создания и, следовательно, захвата группы и первого подзаголовка. Все отлично работает для разбора дневной информации с помощью regex_match
или regex_search
.
Теперь я написал следующие regex expressions
для анализа различной вещи из приведенной выше входной строки следующим образом:
std::string input{ "Mon Nov 25 20:54:36 2013" };
//DayStr:: Exactly Three Letter at the start and followed by spaces(Output: Mon)
std::regex dayStrPattern{ R"(^\w{3}\s)" };
//Day:: Exactly Two Number surrounded by spaces in both side(Output: 25)
std::regex dayPattern{ R"(\s\d{2}\s)" };
//Month:: Exactly Three letter surrounded by spaces in both side(Output: Nov)
std::regex monthPattern{ R"(\s\w{3}\s)" };
//Year:: Exactly Four Number at the end of the string(Output: 2013)
std::regex yearPattern{ R"(\s\d{4}$)" };
//Hour:: Exactly two Number surrounded by spaces in left side and : in right side(Output:20)
std::regex hourPattern{ R"(\s\d{2}:{1})" };
//Min:: Exactly two Number sorruounded by : in left side and : in right side(Output: 54)
std::regex minPattern{ R"(:{1}\d{2}:{1})" };
//Second::Exactly two Number surrounded by : in the left side and space in right side(Output: 36)
std::regex secPattern{ R"(:{1}\d{2}\s)" };
Я тестировал вышеперечисленное выражение здесь, и они кажутся правильными.
Теперь мы можем использовать механизм группировки здесь, чтобы мы std::regex_search
одно выражение регулярного выражения в методе std::regex_search
вместо 7 различных регулярных выражений.?. Таким образом std :: regex_search будет хранить вывод в свой std::smatch
. Возможно ли это здесь? Я читал documentation
и книгу " Tour Of C++ book
но не очень разбирался в regular expression grouping
.
В общем, когда и как мы должны использовать/дизайн группировки, чтобы мы получали различную информацию в одном вызове std :: regex_search?
В этот момент я должен вызвать 7 раз std :: regex_search с различным выражением регулярного выражения, чтобы получить различную информацию, а затем использовать ее. Я уверен, что есть лучший способ добиться этого, чем то, что я делаю прямо сейчас.
Нет необходимости вызывать regex_match
7 раз, чтобы соответствовать 7 частям одного и того же входа, просто создавайте несколько групп захвата, а не один раз каждый раз. Например, измените regex
на
std::regex r{R"(^(\w{3}) (\w{3}) (\d{2}) (\d{2}):(\d{2}):(\d{2}) (\d{4})$)"};
И тогда все совпадения могут быть получены через match_results
после одного вызова regex_match
if (std::regex_match(input,match,r)){
for(auto const& m : match) {
std::cout << m << '\n';
}
}
(\d{1,2})
чтобы иметь дело с датами и временем, состоящими из одной цифры (например, если это первое число месяца и ваш ввод не заполнен нулями).