gpt4 book ai didi

c++ - 从 std::regex 中提取原始正则表达式模式

转载 作者:IT老高 更新时间:2023-10-28 22:59:40 24 4
gpt4 key购买 nike

我有一个函数试图将给定的字符串与给定的正则表达式模式进行匹配。如果它不匹配,它应该创建一个指示这种情况的字符串,并包括它失败的正则表达式模式和字符串的内容。类似的东西:

bool validate_content(const std::string & str, const std::regex & pattern, std::vector<std::string> & errors)
{
if ( false == std::regex_match(str, pattern) )
{
std::stringstream error_str;
// error_str << "Pattern match failure: " << pattern << ", content: " << str;
errors.push_back(error_str.str());
return false;
}
return true;
}

但是,正如您所见,注释掉的行提出了一个挑战:是否有可能恢复正则表达式对象的原始模式?

显然有一种解决方法是提供原始模式字符串(而不是或旁边)正则表达式对象,然后使用它。但是我当然希望不需要包括额外的工作来在每次调用此函数时重新创建正则表达式对象(每次调用函数时重新解析模式的成本)或将正则表达式模式与正则表达式对象(容易出现拼写错误和错误,除非我提供了一个为我做这件事的包装器,这不太方便)。

我在 Ubuntu 14.04 上使用 GCC 4.9.2。

最佳答案

boost::basic_regex 对象有一个 str() 函数,它返回用于构造正则表达式的字符串的(拷贝)。 (它们还提供了 begin()end() 接口(interface),它们将迭代器返回到字符序列,以及一种内省(introspection)捕获子表达式的机制。)

这些接口(interface)在最初的 TR1 正则表达式标准化提案中,但在 n1499: Simplifying Interfaces in basic_regex 采用后于 2003 年被删除。 ,我从中引用:

basic_regex Should Not Keep a Copy of its Initializer

The basic_regex template has a member function str which returns a string object that holds the text used to initialize the basic_regex object… While it might occasionally be useful to look at the initializer string, we ought to apply the rule that you don't pay for it if you don't use it. Just as fstream objects don't carry around the file name that they were opened with, basic_regex objects should not carry around their initializer text. If someone needs to keep track of that text they can write a class that holds the text and the basic_regex object.

关于c++ - 从 std::regex 中提取原始正则表达式模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30990841/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com