想象一下,我有以下字符串:
"I'll have some %1%, some %42% and maybe some %5% as well."
基本上,我有兴趣知道模式%(整数)%之后的最大整数值。
我甚至不确定是否可以使用正则表达式。我可以使用什么正则表达式,以便在上面的例子中答案是42?
P.S。一个简单的解决方案显然是简单地查找任何%(整数)%模式,并使用脚本(c ++代码)迭代所有匹配并找到最高值。我的问题是:是否可以在正则表达式中立即执行此操作?
背景:理解后面的内容可能没有必要回答这个问题,但我想你们中的一些人可能想知道。
基本上我使用的是C ++和boost :: format。格式用这样的占位符构图:%1%,%2%等。如果提供的变量数与格式本身的最大整数值不对应,Boost :: format会抛出异常。我将使用的格式由(受信任的)用户(网站管理员)提供。不过,为了正确地做事,我需要验证模式。因此,我需要在模式中找到最大整数,以确保在运行时不会抛出异常。
如果您使用带有用户提供格式的boost :: format,您是如何处理此问题的?
顺便说一下,没有提升格式标签! (虽然还有其他的boost-foo标签)。解决方案
Billy ONeal提供了正确的答案,Beh Tou Cheh(在对所选答案的评论中)非常友好paste实际代码:
#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;
}
答案 0 :(得分:11)
找到所有这样的值:%([\d]+)%
,将后引用解析为整数(使用lexical_cast
之类的东西),然后选择最高值。 (您可以使用类似std::max_element
的内容)
答案 1 :(得分:0)
即使有人确实设计了一个能够做到这一点的正则表达式,它也不会像简单地迭代匹配一样好。