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