- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有一个代码已经工作了将近 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 似乎是(至少)boost 1.42 中的错误
最佳答案
结构find_regexF
似乎是罪魁祸首。如您所见,它返回一个空结果,其中包含未初始化的 match_results()
。翻看SO找到了以下解决方案:
struct custom_formatter()
{
template< typename T >
std::string operator()( const T & s ) const
{
std::string matchStr;
for (typename T::const_iterator i = Match.begin();
i != Match.end();
i++) {
// perform substitutions via *i
}
return matchStr;
}
}
编辑: 查看如何 Boost uses the formatter这是另一种解决方案:
template<typename InputIteratorT>
std::string operator()(
const regex_search_result<InputIteratorT>& Replace ) const
{
if ( Replace.empty() )
{
return std::string();
}
else
{
std::string matchStr = s.match_results().str(1);
// perform substitutions
return matchStr;
}
}
关于c++ - boost::find_format_all、boost::regex_finder 和自定义正则表达式格式化程序的问题(bug boost 1.42),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2914356/
我有一个代码已经工作了将近 4 年(从 boost 1.33 开始),今天我从 boost 1.36 升级到 boost 1.42,现在我遇到了问题。 我在字符串上调用自定义格式化程序以格式化与 RE
我是一名优秀的程序员,十分优秀!