2011-09-15 20 views
8

Chciałbym wiedzieć, czy istnieje metoda za pomocą metody boost :: split, aby podzielić ciąg znaków, używając pełnych ciągów znaków jako ogranicznika. Na przykład:Zwiększ :: Podziel cały ciąg jako separator

str = „xxaxxxxabcxxxxbxxxcxxx”

jest jakiś sposób, aby podzielić ten ciąg przy użyciu „ABC” jako separatora? Dlatego powrót:

wyniki byłyby ciąg „xxaxxxx” i „xxxxbxxxcxxx”

Jestem świadomy boost :: rozłamu pomocą „is_any_of” orzecznika jednak wywoływanie „is_any_of (” abc „)” spowodowałoby w dzieleniu ciągu na pojedynczy znak "a", "b" i "c", co nie jest tym, czego chcę.

każda pomoc byłaby doceniona.

dziękuję

+0

Powinieneś być w stanie użyć jakiejś kombinacji "równości" i wartości ciągu, które mają być używane jako ogranicznik, ale specyfikacja wymyka się mi teraz. –

+2

możliwy duplikat [Podziel na podciąg] (http://stackoverflow.com/questions/3739280/split-on-substring) – Cubbi

Odpowiedz

6

split_regex jak sugeruje @Mythli jest w porządku. Jeśli nie chcesz zajmować się regex, możesz użyć polecenia ifind_all algo, jak pokazano w tym example. Otrzymasz iterator_range (początek/koniec) wszystkich wystąpień ogranicznika. Twoje żetony znajdują się pomiędzy nimi (oraz na początku i końcu łańcucha).

+0

Dzięki, to rozwiązanie idealnie pasuje do moich potrzeb. – andre

6

Tak istnieje sposób (jest to sposób wiem, może jest lepszy sposób) Użyj boost::algorithm::split_regex podzielić sekwencje znaków gdzie ograniczniki są wyrażenia regularne.

przykład:

vector<string> result; 
boost::algorithm::split_regex(result, str, regex("^((?!abc)*abc(?!abc)*)*$")) ; 
copy(result.begin(), result.end(), ostream_iterator<string>(cout, "\n")) ; 
+1

Dzięki temu to rozwiązanie działa, ale wymaga doładowania. Obecnie używam tylko plików nagłówkowych. – andre

+1

#include