2

我的代码已经工作了近 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 中的一个错误

4

1 回答 1

2

结构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 如何在此处使用格式化程序是另一种解决方案:

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;      
    }
}
于 2010-05-26T16:07:50.133 回答