鉴于std::wstring text
,std::wstring start
,std::wstring end
,目标是提取std::wstring text_out
- 包含start
和end
之间的文字 - 如果它们存在于text
。
注意:如果存在与start
的多个匹配项,请考虑第一个匹配项end
- 考虑最后一个匹配项。
这有效,但有更优雅的解决方案吗?
boost::iterator_range<wstring::iterator> it_start = boost::find_first( text, start);
boost::iterator_range<wstring::iterator> it_end = boost::find_last( text, end);
if (it_start.empty() == false && it_end.empty() == false)
{
text_out.assign( it_start.begin(), it_end.end() );
}
else if ( it_start.empty() == false && it_end.empty() == true )
{
text_out.assign( it_start.begin(), text.end() );
}
else if ( it_start.empty() == true && it_end.empty() == false )
{
text_out.assign( text.begin(), it_end.end() );
}
答案 0 :(得分:0)
我认为没有必要使用boost。使用标准功能可以完成相同的任务。例如
#include <iostream>
#include <string>
int main()
{
std::wstring text( L"startABCDEFend" );
std::wstring start( L"start" );
std::wstring end( L"end" );
std::wstring::size_type pos = text.find( start );
pos = ( pos == std::wstring::npos ? 0 : pos + start.size() );
std::wstring::size_type n = text.rfind( end );
n = ( n == std::wstring::npos || n < pos ? std::wstring::npos : n - pos );
std::wcout << text.substr( pos, n ) << std::endl;
return 0;
}
输出
ABCDEF
答案 1 :(得分:0)
正则表达式适合你。以下是一个示例。
#include <boost/regex.hpp>
#include <string>
#include <iostream>
int main(){
std::string data("begin data begin data end begin data end"), begin("begin"), end("end");
boost::regex r(begin + "(.*)" + end);
boost::smatch result;
if (boost::regex_search(data, result, r)){
std::cout << "data: " << result[1] << "\n";
}
else{
std::cout << "not found\n";
}
return 0;
}