正则表达式:如何找到模式的最大整数值?

时间:2010-11-13 01:33:12

标签: c++ regex boost format

想象一下,我有以下字符串:

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

2 个答案:

答案 0 :(得分:11)

找到所有这样的值:%([\d]+)%,将后引用解析为整数(使用lexical_cast之类的东西),然后选择最高值。 (您可以使用类似std::max_element的内容)

答案 1 :(得分:0)

即使有人确实设计了一个能够做到这一点的正则表达式,它也不会像简单地迭代匹配一样好。