我有一个函数试图将给定的字符串与给定的正则表达式模式进行匹配。如果不匹配,它应该创建一个字符串来指示这种情况,并包含失败的正则表达式模式和字符串的内容。类似于这样的东西:
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()
and end()
将迭代器返回到字符序列的接口,以及用于内省捕获子表达式的机制。)
这些接口包含在最初的 TR1 正则表达式标准化提案中,但在 2003 年采用n1499:简化 basic_regex 中的接口 http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2003/n1499.html,我从中引用:
basic_regex 不应保留其初始值设定项的副本
The basic_regex
模板有一个成员函数str
它返回一个字符串对象,其中包含用于初始化的文本basic_regex
对象...虽然有时查看初始值设定项字符串可能很有用,但我们应该应用这样的规则:如果您不使用它,则无需付费。就像fstream
对象不带有打开它们的文件名,basic_regex
对象不应携带其初始值设定项文本。如果有人需要跟踪该文本,他们可以编写一个类来保存文本和basic_regex
object.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)