使用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),但结果字符串/输出迭代器参数必须使用相同的字符编码。正在搜索的文本。
答案 0 :(得分:1)
版本控制救援!
git blame
版本的regex_replace.hpp
上的HEAD
快速显示模板Formatter
已于2009年12月8日添加了提交ae79f29
,即推特版本为1.42。
另一方面,icu.hpp
中u32regex_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() );