Regex: как найти максимальное целочисленное значение шаблона? - PullRequest
12 голосов
/ 13 ноября 2010

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

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

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

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

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

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

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

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

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

Решение

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

#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;
}

Ответы [ 2 ]

11 голосов
/ 13 ноября 2010

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

0 голосов
/ 13 ноября 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...