BOOST正则表达式 - 没有带回调函数的u32regex_replace()原型

时间:2015-03-14 19:18:47

标签: c++ regex boost utf-8 mfc

使用Boost Regex v1.56 from VS2010 platform/C++/Mfc

我正在将一些C ++ ANSI转换为Unicode 我在regex_replace()使用了仿函数回调( Formatter fmt )。

我找不到使用u32regex_replace()的回调副本 在icu.hpp中似乎没有类似的模板。

我宁愿不必使用u32regex_search()来模拟替代品。 有人知道是否存在u32对应的回调功能 regex_replace的?

注意 - Boost正则表达式文档在u32等价物上说明了这一点:

  

对于<boost/regex.hpp>定义的每个regex_replace算法,<boost/regex/icu.hpp>定义了一个重载算法,该算法采用相同的参数,但称为u32regex_replace,并且接受UTF-8,UTF -16或UTF-32编码数据,以及ICU UnicodeString作为输入。传递给算法的输入序列和格式字符串说明符可以独立编码(例如,一个可以是UTF-8,另一个可以是UTF-16),但结果字符串/输出迭代器参数必须使用相同的字符编码。正在搜索的文本。

2 个答案:

答案 0 :(得分:1)

版本控制救援!

git blame版本的regex_replace.hpp上的HEAD快速显示模板Formatter已于2009年12月8日添加了提交ae79f29,即推特版本为1.42。

另一方面,icu.hppu32regex_replace的模板定义自2005年1月13日提交71a0e02以来没有改变,即第1.3.3节。

基于此,我们必须得出结论,在格式化时,对函数对象以及字符串的支持从未使它成为u32对应的函数,并且您很遗憾在这个时候运气不好。

boost.org提供有关报告和修复错误的this information

答案 1 :(得分:0)

我必须通过解决方法回答我自己的问题 由于我找不到它,因此没有找到u32regex_replace的回调。

查看正常的regex_replace和icu.cpp中的u32内容后,
很明显,他使用regex_iterator几乎所有东西。

所以,这几乎会复制带有 Formatter fmt 的regex_replace 仿函数。

 // Ficticous formatter string.
 std::wstring sReplace = _T( "$1$2" );

 // Callback Functor.
 std::wstring Callback( const boost::wsmatch m )
 {
    // Do stuff here, thats why its a callbck !! 
    return m.format( sReplace );
 }

 // ------------------------------------------

 // Ficticous test regex
 boost::u32regex Regex = make_u32regex( _T("(?<=(\\w))(?=(\\w))") ));

 // Create a u32regex_iterator via make_u32regex_iterator
 // 
 boost::u32regex_iterator<std::wstring::const_iterator>
    i(boost::make_u32regex_iterator( sInput, Regex)), j;

 // Ficticous input string.
 std::wstring sInput = _T( "This is a sentence"" );

 // Maintain a last iterator to use for the ending.
 std::wstring::const_iterator last = sInput.begin();

 // Clear the output string
 sOutput = _T("");

 // Do global replace with callback.
 while(i != j)
 {
    sOutput.append( (*i).prefix() );      // append last match to here
    sOutput.append( Callback( (*i) ) ) ;  // append callback string
    last = (*i)[0].second;                // save to 'last' the end of this match
    ++i;
 }

 // Append any trailing text.
 sOutput.append( last, stext.end() );