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

aug*_*tin 12 c++ regex format boost

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

"I'll have some %1%, some %42% and maybe some %5% as well."
Run Code Online (Sandbox Code Playgroud)

基本上,我有兴趣知道模式%(整数)%之后的最大整数值.

我甚至不确定是否可以使用正则表达式.我可以使用什么正则表达式,以便在上面的例子中答案是42?

PS一个简单的解决方案显然是简单地查找任何%(整数)%模式,并使用脚本(c ++代码)迭代所有匹配并找到最高值.我的问题是:是否可以在正则表达式中立即执行此操作?

背景:理解下面的内容可能没有必要回答这个问题,但我想你们中的一些人可能想知道.

基本上我使用的是C++和boost :: format.格式用这样的占位符构图:%1%,%2%等.如果提供的变量数与格式本身的最大整数值不对应,Boost :: format会抛出异常.我将使用的格式由(受信任的)用户(网站管理员)提供.不过,为了正确地做事,我需要验证模式.因此,我需要在模式中找到最大整数,以确保在运行时不会抛出异常.

如果您使用带有用户提供格式的boost :: format,您是如何处理此问题的?

顺便说一句,没有boost-format标签!(虽然还有其他的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;
}
Run Code Online (Sandbox Code Playgroud)

Bil*_*eal 11

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

  • 使用Billy的建议和StrTk,我得到了以下解决方案:http://pastie.org/1294443 (25认同)
  • @Billy:不是100%肯定,但我认为它被称为捕获组,而反向引用是指您在同一个正则表达式中多次匹配同一组. (2认同)