2010-09-17 10 views
7

¿Cómo dividiría una cadena basada en otra subcadena de una manera simple?Dividir en la subcadena

p. Ej. dividida en "\ r \ n"

message1\r\nmessage2 

=>

message1 
message2 

Por lo que he podido encontrar tanto impulso :: tokenizer e impulsar :: dividida sólo funciona en los personajes individuales.

EDIT:

Soy consciente de que podría hacer esto mediante el uso de std :: string :: encontrar y std :: string :: substr y tienen un bucle etc ... pero eso no es lo que quiero decir por "simple".

Respuesta

16

Aunque impulso :: dividida de hecho toma un predicado que opera en los personajes, hay un impulso string algorithm que puede dividir en subseries:

#include <string> 
#include <vector> 
#include <algorithm> 
#include <iterator> 
#include <iostream> 
#include <boost/algorithm/string/iter_find.hpp> 
#include <boost/algorithm/string/finder.hpp> 
int main() 
{ 
    std::string input = "message1foomessage2foomessage3"; 

    std::vector<std::string> v; 
    iter_split(v, input, boost::algorithm::first_finder("foo")); 

    copy(v.begin(), v.end(), std::ostream_iterator<std::string>(std::cout, " ")); 
    std::cout << '\n'; 
} 
1

Puede buscar la próxima ocurrencia de su subcadena que se use como token dividido. Tal método probablemente devolverá el índice de la próxima ocurrencia y teniendo esto puede dividir la cadena usted mismo.

+1

+1, .. Seguro que podría hacer un str.find y luego subcadena etc ... pero eso no es lo que yo defino como una manera simple. – ronag

0

Es una gran dependencia, pero personalmente me gusta Boost::Tokenizer.

Desde el ejemplo de la página:

// simple_example_1.cpp 
#include<iostream> 
#include<boost/tokenizer.hpp> 
#include<string> 

int main(){ 
    using namespace std; 
    using namespace boost; 
    string s = "This is, a test"; 
    tokenizer<> tok(s); 
    for(tokenizer<>::iterator beg=tok.begin(); beg!=tok.end();++beg){ 
     cout << *beg << "\n"; 
    } 
} 
+1

Esto solo funciona para delimitadores de un solo carácter (o delimitadores que son combinaciones de delimitadores de un solo carácter, en cualquier orden), OP pregunta acerca de las subcadenas usadas como delimitadores. – Cubbi

+0

@Cubbi: tiene razón en el ejemplo dado, pero puede proporcionar un tokenizador personalizado que se divida en subcadenas. – ybungalobill

-1

Como siempre y cuando se trate de espacios en blanco:

string s("somethin\nsomethingElse"); 
strinstream ss(s); 
string line; 
vector<string> lines; 
while(ss >> line) 
{ 
    lines.push_back(line); 
} 

Como alternativa, use getline(), que le permite especificar el carácter tokenizing como un tercer parámetro opcional:

string s("Something\n\rOr\n\rOther"); 
stringstream ss(s); 
vector<string> lines; 
string line; 
while(getline(ss,line)) 
{ 
    lines.push_back(line); 
}