gpt4 book ai didi

c++ - boost::find_format_all、boost::regex_finder 和自定义正则表达式格式化程序的问题(bug boost 1.42)

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:00:35 24 4
gpt4 key购买 nike

我有一个代码已经工作了将近 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/

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