Регулярное выражение: как найти максимальное целочисленное значение шаблона?

Представьте, что у меня есть следующая строка:

"I'll have some %1%, some %42% and maybe some %5% as well."

По сути, меня интересует максимальное целочисленное значение, соответствующее шаблону% (integer)%.

Я даже не уверен, что это возможно с регулярным выражением. Какое регулярное выражение я могу использовать, чтобы в приведенном выше примере ответ был 42?

PS Одно простое решение, очевидно, состоит в том, чтобы просто искать любые шаблоны% (integer)% и использовать скрипт (код C ++) для перебора всех совпадения и найдите наибольшее значение. У меня вопрос: можно ли сделать это сразу в регулярном выражении?

Общие сведения : понимание того, что следует ниже, вероятно, не является необходимым для ответа на вопрос, но я подумал, что некоторые из вас могут захотеть узнать.

В основном я использую C ++ и boost :: format. Форматы формируются с помощью таких заполнителей:% 1%,% 2% и т. Д. Boost :: format генерирует исключение, если количество предоставленных переменных не соответствует максимальному целочисленному значению в самом формате. Форматы, которые я собираюсь использовать, предоставлены (доверенными) пользователями (администраторами веб-сайта). Тем не менее, чтобы все делать правильно, мне нужно проверить шаблон. Таким образом, мне нужно найти максимальное целое число в шаблоне, чтобы исключение не возникло во время выполнения.

Если вы используете boost :: format с пользовательскими форматами, как вы справились с этой проблемой?

Кстати, тега ускоренного формата нет! (хотя есть и другие теги boost-foo).

Решение

Билли ONeal предоставил правильный ответ, и Beh Tou Cheh (в комментариях к выбранному ответу) был любезен вставить ] фактический код:

#include 
#include 
#include 
#include "strtk.hpp"

int main() 
{
   std::string s = "I'll have some %1%, some %42% and maybe some %5% as well.";
   std::deque int_list;
   strtk::split_regex("%([\\d]+)%",
                       s,
                       strtk::range_to_type_back_inserter(int_list),
                       strtk::match_mode::match_1);

   if (!int_list.empty())
   {
        std::cout << "max: " << strtk::max_of_cont(int_list) << std::endl;
   }

   return 0;
}

12
задан Community 23 May 2017 в 11:47
поделиться