Представьте, что у меня есть следующая строка:
"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;
}