【问题标题】:Regex: how to find the maximum integer value of a pattern?正则表达式:如何找到模式的最大整数值?
【发布时间】:2011-05-09 09:34:12
【问题描述】:

假设我有以下字符串:

"I'll have some %1%, some %42% and maybe some %5% as well."

基本上,我有兴趣知道遵循模式 %(integer)% 的最大整数值。

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

附:一种简单的解决方案显然是简单地查找任何 %(integer)% 模式,并使用脚本(c++ 代码)遍历所有匹配项并找到最高值。我的问题是:是否可以在正则表达式中立即执行?

背景:回答问题可能不需要了解以下内容,但我想你们中的一些人可能想知道。

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

如果您将 boost::format 与用户提供的格式一起使用,您是如何处理这个问题的?

顺便说一句,没有 boost-format 标签! (虽然还有其他 boost-foo 标签)。

解决方案

Billy ONeal 提供了正确答案,Beh Tou Cheh(在所选答案的 cmets 中)对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;
}

【问题讨论】:

  • 我对 boost::regex 库的了解不够好,无法回答(只是学习它),但除了您自己建议的简单解决方案之外,我建议不要做任何事情。尽管 Perl 黑客可能会告诉您其他情况,但这不是正则表达式的目的。它们非常适合匹配字符串,但不适合算术。
  • 真的,不要试图将所有内容都塞进正则表达式中,从而使事情变得更复杂。只是迭代。
  • 我只是尝试将参数传递给格式字符串并将其转换为字符串,所有这些都在捕获错误格式异常的 try-catch 语句中。确实,除了尝试之外,您没有其他简单的方法可以验证格式字符串。例如,格式字符串也允许使用 printf 语法。否则,如果您真的想这样做,只需使用简单的正则表达式进行迭代:“%\d+%”。

标签: c++ regex boost format


【解决方案1】:

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

【讨论】:

  • 即,不要迭代解决方案,而是让库为您完成 :)
  • @Billy:您需要修剪前导和尾随“%”,因为您提供的正则表达式将返回这些,如果看起来它们,lexical_cast 会抛出一个 bad_lexical_cast 异常。
  • @Billy:我刚刚用 boost regex (1.44) 进行了尝试,它返回带有“%”符号的整数。例如: boost::sregex_iterator itr(s.begin(),s.end(),"%([\\d]+)%");应该以其他方式完成吗?我认为 boost regex 的默认模式是 posix regex
  • @Billy:不是 100% 肯定,但我认为它被称为捕获组,反向引用是您如何在同一个正则表达式中多次匹配同一个组。
  • 使用比利的建议和 StrTk,我得到了以下解决方案:pastie.org/1294443
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-09
    • 1970-01-01
    相关资源
    最近更新 更多