简体   繁体   中英

Split string using multiple string delimiters

Suppose I have string like

   Harry potter was written by J. K. Rowling

How to split string using was and by as a delimiter and get result in vector in C++?

I know split using multiple char but not using multiple string.

If you use c++11 and clang there is a solution using a regex string tokenizer:

#include <fstream>
#include <iostream>
#include <algorithm>
#include <iterator>
#include <regex>

int main()
{
   std::string text = " Harry potter was written by J. K. Rowling.";

   std::regex ws_re("(was)|(by)"); 
   std::copy( std::sregex_token_iterator(text.begin(), text.end(), ws_re, -1),
              std::sregex_token_iterator(),
              std::ostream_iterator<std::string>(std::cout, "\n"));


}

The output is :

Harry potter 
 written 
 J. K. Rowling.

Sadly gcc4.8 does not have the regex fully integrated. But clang does compile and link this correctly.

Brute force approach, not boost, no c++11, optimizations more than welcome:

/** Split the string s by the delimiters, place the result in the 
    outgoing vector result */
void split(const std::string& s, const std::vector<std::string>& delims,
           std::vector<std::string>& result)
{
    // split the string into words
    std::stringstream ss(s);
    std::istream_iterator<std::string> begin(ss);
    std::istream_iterator<std::string> end;
    std::vector<std::string> splits(begin, end);

    // then append the words together, except if they are delimiter
    std::string current;
    for(int i=0; i<splits.size(); i++)
    {
        if(std::find(delims.begin(), delims.end(), splits[i]) != delims.end())
        {
            result.push_back(current);
            current = "";
        }
        else
        {
            current += splits[i] + " " ;
        }
    }

    result.push_back(current.substr(0, current.size() - 1));
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM