如何从字符串开始到第二个分隔符提取子字符串?

时间:2018-07-05 07:26:42

标签: c++ string substring

我的字符串是:std :: string achRecBuff =“ usbaudio_1_req:some string”;

我要从该字符串中提取字符串,直到第二个定界符“ _”为止。 因此,提取的字符串应类似于“ usbaudio_1”。

我该怎么做?

3 个答案:

答案 0 :(得分:1)

当第二个下划线始终与最后一个下划线相同时,一个简单的解决方案如下所示:

const auto pos = achRecBuff.find_last_of('_');

const std::string upTo2ndUnderscore = achRecBuff.substr(0, pos);

编辑:考虑到一般情况(感谢@chris指出),此代码段也可以满足您的要求:

template <class Container, class Element>
Container beforeNthMatch(const Container& c, const Element& value, unsigned n)
{
    using std::cbegin;
    using std::cend;
    auto pos = cbegin(c);

    while (n-- != 0) {
        pos = std::find(++pos, cend(c), value);

        if (pos == cend(c))
            return {};
    }

    return {cbegin(c), pos};
}

在您的情况下,调用看起来像

const std::string upTo2ndUnderscore = beforeNthMatch(achRecBuff, '_', 2);

涵盖了空输入容器之类的情况,您也可以将其与其他容器一起使用,例如在std::vector<int>中找到第n个给定的整数。

答案 1 :(得分:1)

您可以多次使用std::string::find,如下所示:

std::string extract_special_part(std::string const& s)
{
    if(auto pos = s.find('_') + 1)
        if((pos = s.find('_', pos)) + 1)
            return s.substr(0, pos);

    return {};
}

int main()
{
    std::string achRecBuff = "usbaudio_1_req:some string";

    std::cout << extract_special_part(achRecBuff) << '\n';
}

输出:

usbaudio_1

当您向其中添加1时,它依靠std::string::npos明确定义的行为回合归零。如果找不到该字符,则if()语句将失败,因为std::string::npos + 1变为0,即false

答案 2 :(得分:0)

#include <iostream>
int main() {
        std::string a="usbaudio_1_req:some string" ;
        std::string::size_type f = a.find("_") ; // find 1st pos
        if ( f!=std::string::npos ) {
                f=a.find("_", f+1) ;    // find 2nd pos
                if ( f!=std::string::npos ) {
                        std::string b = a.substr(0, f) ;
                        std::cout << b << std::endl ;
                }
        }
        return 0 ;
}

输出为

usbaudio_1