Как проверить, какая подходящая группа была использована для сопоставления (boost-regex)

Я использую 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 индекс, указывающий на строку перехвата группы для форматирования времени, также может измениться.

Есть ли хороший способ сделать это? Что-то вроде именования групп? Буду благодарен за любую помощь.

1

Решение

Ты можешь использовать 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);
1

Другие решения

Динамически строить regex_string из пар имя / шаблон и возвращают отображение имени-> индекса, а также регулярное выражение. Затем напишите некоторый код, который определяет, происходит ли совпадение с данным именем.

Если вы ненормальный, вы можете сделать это во время компиляции (отображение от тега к индексу, которое есть). Это того не стоит.

0