Подтвердить что ты не робот

Regex: как найти максимальное целочисленное значение шаблона?

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

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

В принципе, мне интересно узнать максимальное целочисленное значение, которое следует за шаблоном% (целое число)%.

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

P.S. Одно простое решение состоит в том, чтобы просто искать любые% (целые)% шаблонов и использовать script (код С++) для повторения всех совпадений и поиска наивысшего значения. Мой вопрос: возможно ли это сделать прямо в регулярном выражении?

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

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

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

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

Решение

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

#include <iostream>
#include <string>
#include <deque>
#include "strtk.hpp"

int main() 
{
   std::string s = "I'll have some %1%, some %42% and maybe some %5% as well.";
   std::deque<int> 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;
}
4b9b3361

Ответ 1

Найти все значения: %([\d]+)%, проанализировать обратную ссылку как целое число (используя что-то вроде lexical_cast) и выбрать самое высокое значение. (Для этого вы можете использовать что-то вроде std::max_element)

Ответ 2

Даже если кто-то разработал регулярное выражение, способное это сделать, оно не будет выполняться так же просто, как просто повторение совпадений.