我的代码已经工作了近 4 年(自 boost 1.33 以来),今天我从 boost 1.36 升级到 boost 1.42,现在我遇到了问题。
我在字符串上调用自定义格式化程序来格式化与 REGEX 匹配的字符串部分。
例如,如果 REGEX 包含 "([;:])",则类似 "abc;def:" 的字符串将更改为 "abc\2Cdef\3B"
boost::find_format_all( mystring, boost::regex_finder( REGEX ), custom_formatter() );
自定义格式化程序如下所示:
struct custom_formatter()
{
template< typename T >
std::string operator()( const T & s ) const
{
std::string matchStr = s.match_results().str(1);
// perform substitutions
return matchStr;
}
}
这工作得很好,但是对于 boost 1.42,我知道有“未初始化” s.match_results() 会产生 boost::exception_detail::clone_implINS0_::error_info_injectorISt11logic_errorEEEE - 尝试访问未初始化的 boost::match_results<> 类。
这意味着有时我在仿函数中格式化字符串但没有匹配。
难道我做错了什么?或者当没有匹配时输入仿函数是否正常,我应该检查一些东西?
目前我的解决方案是尝试{}catch(){} 异常,一切正常,但不知何故感觉不太好。
编辑1
实际上我在每个字符串的末尾都有一个新的空匹配来解析。
EDIT2:一种受 ablaeul 启发的解决方案
template< typename T >
std::string operator()( const T & s ) const
{
if( s.begin() == s.end() ) return std::string();
std::string matchStr = s.match_results().str(1);
// perform substitutions
return matchStr;
}
EDIT3 似乎是(至少)提升 1.42 中的一个错误