提取由开始和结束字符串定义的子字符串(C ++)

时间:2014-08-17 23:11:05

标签: c++ boost substring

鉴于std::wstring textstd::wstring startstd::wstring end,目标是提取std::wstring text_out - 包含startend之间的文字 - 如果它们存在于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() );
}

2 个答案:

答案 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;
}