Я использую boost :: regex для разбора некоторой строки форматирования, где символ «%» является escape-символом. Потому что у меня нет большого опыта работы с boost :: regex и вообще с regex, если честно, я делаю метод проб и ошибок. Этот код является своего рода прототипом, который я придумал.
std::string regex_string =
"(?:%d\\{(.*)\\})|" //this group will catch string for formatting time
"(?:%([hHmMsSqQtTlLcCxXmMnNpP]))|" //symbols that have some meaning
"(?:\\{(.*?)\\})|" //some other groups
"(?:%(.*?)\\s)|""(?:([^%]*))";
boost::regex regex;
boost::smatch match;
try
{
regex.assign(regex_string, boost::regex_constants::icase);
boost::sregex_iterator res(pattern.begin(), pattern.end(), regex);
//pattern in line above is string which I'm parsing
boost::sregex_iterator end;
for(; res != end; ++res)
{
match = *res;
output << match.get_last_closed_paren();
//I want to know if the thing that was just written to output is from group describing time string
output << "\n";
}}
catch(boost::regex_error &e)
{
output<<"regex error\n";
}
И это работает довольно хорошо, на выходе у меня есть именно то, что я хочу поймать. Но я не знаю, из какой это группы. Я мог бы сделать что-то вроде match[index_of_time_group]!=""
но это немного хрупко и выглядит не очень хорошо. Если я изменю regex_string
индекс, указывающий на строку перехвата группы для форматирования времени, также может измениться.
Есть ли хороший способ сделать это? Что-то вроде именования групп? Буду благодарен за любую помощь.
Ты можешь использовать boost::sub_match::matched
член bool:
if(match[index_of_time_group].matched) process_it(match);
Также можно использовать именованные группы в регулярном выражении, например: (?<name_of_group>.*)
и с помощью этой строки можно изменить на:
if(match["name_of_group"].matched) process_it(match);
Динамически строить regex_string
из пар имя / шаблон и возвращают отображение имени-> индекса, а также регулярное выражение. Затем напишите некоторый код, который определяет, происходит ли совпадение с данным именем.
Если вы ненормальный, вы можете сделать это во время компиляции (отображение от тега к индексу, которое есть). Это того не стоит.