C++字符串、宽字符串分割

整理C++字符串分割,包括C++11的和之前的用法。

#include <iostream>
#include <regex>
#include <vector>
#include <string>
using namespace std;

vector<string> string_split(string srcStr, const string &delimit)
{
    int nPos = 0;
    vector<string> vec;
    nPos = srcStr.find(delimit.c_str());
    while (-1 != nPos)
    {
        string temp = srcStr.substr(0, nPos);
        vec.push_back(temp);
        srcStr = srcStr.substr(nPos + delimit.length());
        nPos = srcStr.find(delimit.c_str());
    }
    vec.push_back(srcStr);
    return vec;
}

vector<string> string_split11(const string &in, const string &delimit)
{
    vector<string> ret;
    try {
        regex re{ delimit };
        return vector<string>{std::sregex_token_iterator(in.begin(), in.end(), re, -1),
            std::sregex_token_iterator()};
    }
    catch (const std::exception e)
    {
        cout << __FUNCTION__<<" exception: " << e.what() << endl;
    }
    return ret;
}

vector<string> charS_split(const char* in, const char* delimit)
{
    vector<string> ret;
    int length = strnlen(in, 1024) + 1;
    char *tempIn = new char[length];

    strcpy_s(tempIn, length, in);
    char *next_token = NULL;
    char *token = NULL;
    token = strtok_s(tempIn, delimit, &next_token);

    while (token != NULL)
    {
        if (token != NULL)
        {
            ret.push_back(string(token));
            token = strtok_s(NULL, delimit, &next_token);
        }
    }
    delete tempIn;
    return ret;
}
vector<string> charS_split11(const char* in, const char* delimit)
{
    vector<string> ret;
    try {
        regex re{ delimit };
        return vector<string>{std::cregex_token_iterator(in, in + strlen(in), re, -1),
            std::cregex_token_iterator()};
    }
    catch (const std::exception e)
    {
        cout << __FUNCTION__ << " exception: " << e.what() << endl;
    }
    return ret;
}

vector<wstring> wstring_split(const wstring &in, const wstring &delimit)
{
    vector<wstring> vec;
    wstring tempString = in;
    size_t nPos = in.find(delimit.c_str());
    while (wstring::npos != nPos)
    {
        wstring temp = tempString.substr(0, nPos);
        vec.push_back(temp);
        tempString = tempString.substr(nPos + delimit.length());
        nPos = tempString.find(delimit.c_str());
    }
    vec.push_back(tempString);

    return vec;
}

vector<wstring> wstring_split11(const wstring &in, const wstring &delimit)
{
    vector<wstring> ret;
    try
    {
        std::wregex rx{ delimit };
        return vector<wstring>{std::wsregex_token_iterator(in.begin(), in.end(), rx, -1),
            std::wsregex_token_iterator()
        };
    }
    catch (const std::exception e)
    {
        cout << __FUNCTION__ << " exception: " << e.what() << endl;
    }
    return ret;
}
vector<wstring> wcharS_split(const wchar_t* in, const wchar_t* delimit)
{
    vector<wstring> ret;
    int length = wcsnlen_s(in, 1024) + 1;
    wchar_t *tempIn = new wchar_t[length];

    wcscpy_s(tempIn, length, in);

    wchar_t *next_token = NULL;
    wchar_t *token = NULL;
    token = wcstok_s(tempIn, delimit, &next_token);

    while (token != NULL)
    {
        if (token != NULL)
        {
            ret.push_back(wstring(token));
            token = wcstok_s(NULL, delimit, &next_token);
        }
    }
    delete tempIn;
    return ret;
}
vector<wstring> wcharS_split11(const wchar_t *in, const wchar_t *delimit)
{
    vector<wstring> ret;
    try
    {
        std::wregex re{ delimit };
        return vector<wstring>{std::wcregex_token_iterator(in, in + wcslen(in), re, -1),
            std::wcregex_token_iterator()};
    }
    catch (const std::exception e)
    {
        cout << __FUNCTION__ << " exception: " << e.what() << endl;
    }
    return ret;
}

void PrintFunc (string iStr) {
  cout << iStr << endl;
}
int main(int argc, char *argv[])
{
    vector<string> ret = string_split("hello__world!__I__am__OK!", "__");
    //string oneString;
    for_each (ret.begin(), ret.end(), PrintFunc);
    for_each (ret.begin(), ret.end(), [](const string& s){cout<<s<<endl;});

    cout<<"-----------------------"<<endl;

    ret.clear();
    ret = string_split11("Hello,,world!,,I,,am,,OK!",",,");
    for_each (ret.begin(), ret.end(), [](const string& s){cout<<s<<endl;});

    cout<<"-----------------------"<<endl;

    ret.clear();
    ret = charS_split("Hello__world!__I__am__OK!", "__");
    for_each(ret.begin(), ret.end(), [](const string& s){cout<<s<<endl;});

    cout<<"-----------------------"<<endl;

    ret.clear();
    ret = charS_split11("Hello__world!__I__am__OK!", "__");
    for_each(ret.begin(), ret.end(), [](const string& s){cout<<s<<endl;});

    cout<<"-----------------------"<<endl;

    vector<wstring> wVec;
    wVec = wstring_split(L"Hello__world!__I__am__OK!", L",,");
    for_each(wVec.begin(), wVec.end(), [](const wstring &s){wcout<<s<<endl;});

    cout<<"-----------------------"<<endl;

    wVec = wstring_split11(L"Hello__world!__I__am__OK!", L"__");
    for_each(wVec.begin(), wVec.end(), [](const wstring &s){wcout<<s<<endl;});

    cout<<"-----------------------"<<endl;

    wVec = wcharS_split(L"Hello__world!__I__am__OK!", L"__");
    for_each(wVec.begin(), wVec.end(), [](const wstring &s){wcout<<s<<endl;});

    cout<<"-----------------------"<<endl;

    wVec = wcharS_split11(L"Hello__world!__I__am__OK!", L"__");
    for_each(wVec.begin(), wVec.end(), [](const wstring &s){wcout<<s<<endl;});

    cout<<"-----------------------"<<endl;

    return 0;
}

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值