【发布时间】: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+%”。