11

I would like to know if there is a method using boost::split to split a string using whole strings as a delimiter. For example:

str = "xxaxxxxabcxxxxbxxxcxxx"

is there a method to split this string using "abc" as a a delimiter? Therefore returning:

Results would be the string "xxaxxxx" and "xxxxbxxxcxxx".

I am aware of boost::split using the "is_any_of" predicate, however invoking is_any_of("abc") would result in splitting the string at the single character 'a', 'b', and 'c' as well, which is not what I want.

Alexis Wilke
  • 19,179
  • 10
  • 84
  • 156
andre
  • 7,018
  • 4
  • 43
  • 75
  • You should be able to use some combination of `equals` and the string value to be used as delimiter, but the specifics elude me right now. – K-ballo Sep 15 '11 at 20:21
  • 2
    possible duplicate of [Split on substring](http://stackoverflow.com/questions/3739280/split-on-substring) – Cubbi Sep 15 '11 at 21:09

3 Answers3

8

Yes there is a way (this is a way I know, maybe there is a better way) Use boost::algorithm::split_regex to split character sequences where delimiters are regular expressions.

Example:

vector< string > result;
boost::algorithm::split_regex( result, str, regex( "^((?!abc)*abc(?!abc)*)*$" ) ) ;
copy( result.begin(), result.end(), ostream_iterator<string>( cout, "\n" ) ) ;
Mythli
  • 5,995
  • 2
  • 24
  • 31
6

split_regex as suggested by @Mythli is fine. If you don't want to deal with regex, you can use ifind_all algo, as is shown in this example. You receive iterator_range (begin/end) of all occurrences of you delimiter. Your tokens are between them (and at the beginning and end of string).

Andriy Tylychko
  • 15,967
  • 6
  • 64
  • 112
0

If you know what characters your input string is comprised of (e.g. a simple English sentence, with only EN characters), you can surround your word_delimiter with a special_symbol, replace all appearances of your word delimiter with it and split by the special_symbol.

For example, I used '%' here:

std::vector<std::string> sentence_parts;
boost::replace_all(sentence, word, "%" + word_delimiter + "%");
boost::split(sentence_parts, sentence, boost::is_any_of("%"));

You need to be sure that your input string will never have the special symbol in it, otherwise it won't work well!

may21
  • 31
  • 1
  • 3
  • Why would this be preferable to the more straightforward approach Mythli already described? – Sneftel Dec 27 '20 at 09:32
  • It's not necessarily preferable, it's another way to do it. Personally, I prefer not to deal with regexes... – may21 Dec 27 '20 at 09:40