Dividir una cadena por algún delimitador es una tarea muy común. Por ejemplo, tenemos una lista de elementos separados por comas de un archivo y queremos elementos individuales en una matriz.
Casi todos los lenguajes de programación proporcionan una función para dividir una cadena por algún delimitador.
Cª:
// Splits str[] according to given delimiters. // and returns next token. It needs to be called // in a loop to get all tokens. It returns NULL // when there are no more tokens. char * strtok(char str[], const char *delims);>
C
// A C/C++ program for splitting a string> // using strtok()> #include> #include> int> main()> {> >char> str[] =>'Geeks-for-Geeks'>;> >// Returns first token> >char> *token =>strtok>(str,>'-'>);> > >// Keep printing tokens while one of the> >// delimiters present in str[].> >while> (token != NULL)> >{> >printf>(>'%s
'>, token);> >token =>strtok>(NULL,>'-'>);> >}> >return> 0;> }> |
>
pitón filtrado
>
Output: Geeks for Geeks>
Complejidad del tiempo: En)
Espacio Auxiliar: En)
En C++
Note: The main disadvantage of strtok() is that it only works for C style strings. Therefore we need to explicitly convert C++ string into a char array. Many programmers are unaware that C++ has two additional APIs which are more elegant and works with C++ string.>
Método 1: Usando la API stringstream de C++
Requisito previo : flujo de cuerdas API
El objeto Stringstream se puede inicializar usando un objeto de cadena, automáticamente tokeniza cadenas en el espacio char. Al igual que cin stream, stringstream te permite leer una cadena como un flujo de palabras. Alternativamente, también podemos utilizar la función getline para tokenizar una cadena en cualquier delimitador de un solo carácter .
Some of the Most Common used functions of StringStream. clear() — flushes the stream str() — converts a stream of words into a C++ string object. operator <<— pushes a string object into the stream. operator>> — extrae una palabra de la secuencia.>
El siguiente código lo demuestra.
C++
#include> using> namespace> std;> // A quick way to split strings separated via spaces.> void> simple_tokenizer(string s)> {> >stringstream ss(s);> >string word;> >while> (ss>> palabra) {> >cout << word << endl;> >}> }> // A quick way to split strings separated via any character> // delimiter.> void> adv_tokenizer(string s,>char> del)> {> >stringstream ss(s);> >string word;> >while> (!ss.eof()) {> >getline(ss, word, del);> >cout << word << endl;> >}> }> int> main(>int> argc,>char> const>* argv[])> {> >string a =>'How do you do!'>;> >string b =>'How$do$you$do!'>;> >// Takes only space separated C++ strings.> >simple_tokenizer(a);> >cout << endl;> >adv_tokenizer(b,>'$'>);> >cout << endl;> >return> 0;> }> |
>
>
Output : How do you do!>
Complejidad del tiempo: O(n)
Espacio auxiliar:O(n)
Donde n es la longitud de la cadena de entrada.
Método 2: utilizar las API find() y substr() de C++.
Requisito previo: encontrar función y substr() .
Este método es más robusto y puede analizar una cadena con cualquier delimitador , no solo espacios (aunque el comportamiento predeterminado es separar en espacios). La lógica es bastante simple de entender a partir del código siguiente.
C++
#include> using> namespace> std;> void> tokenize(string s, string del =>' '>)> {> >int> start, end = -1*del.size();> >do> {> >start = end + del.size();> >end = s.find(del, start);> >cout << s.substr(start, end - start) << endl;> >}>while> (end != -1);> }> int> main(>int> argc,>char> const>* argv[])> {> >// Takes C++ string with any separator> >string a =>'How$%do$%you$%do$%!'>;> >tokenize(a,>'$%'>);> >cout << endl;> >return> 0;> }> |
cadena en int
>
>
Output: How do you do !>
Complejidad del tiempo: O(n)
Espacio auxiliar:O(1)
Donde n es la longitud de la cadena de entrada.
Método 3: usar una cadena temporal
Si se le indica que la longitud del delimitador es 1, simplemente puede usar una cadena temporal para dividir la cadena. Esto ahorrará tiempo adicional a la función en el caso del método 2.
C++
#include> using> namespace> std;> void> split(string str,>char> del){> >// declaring temp string to store the curr 'word' upto del> >string temp =>''>;> > >for>(>int> i=0; i<(>int>)str.size(); i++){> >// If cur char is not del, then append it to the cur 'word', otherwise> >// you have completed the word, print it, and start a new word.> >if>(str[i] != del){> >temp += str[i];> >}> >else>{> >cout << temp <<>' '>;> >temp =>''>;> >}> >}> > >cout << temp;> }> int> main() {> >string str =>'geeks_for_geeks'>;>// string to be split> >char> del =>'_'>;>// delimiter around which string is to be split> > >split(str, del);> > >return> 0;> }> |
>
>Producción
geeks for geeks>
Complejidad del tiempo: En)
Espacio Auxiliar: En)
En Java:
En Java, split() es un método de la clase String.
// expregexp is the delimiting regular expression; // limit is the number of returned strings public String[] split (String regexp, int limit); // We can call split() without limit also public String[] split (String regexp)>
Java
delimitador java
// A Java program for splitting a string> // using split()> import> java.io.*;> public> class> Test> {> >public> static> void> main(String args[])> >{> >String Str =>new> String(>'Geeks-for-Geeks'>);> >// Split above string in at-most two strings> >for> (String val: Str.split(>'-'>,>2>))> >System.out.println(val);> >System.out.println(>''>);> > >// Splits Str into all possible tokens> >for> (String val: Str.split(>'-'>))> >System.out.println(val);> >}> }> |
>
>
Producción:
Geeks for-Geeks Geeks for Geeks>
Complejidad del tiempo: En)
Espacio Auxiliar: O(1)
En pitón:
El método split() en Python devuelve una lista de cadenas después de dividir la cadena dada por el separador especificado.
// regexp is the delimiting regular expression; // limit is limit the number of splits to be made str. split (regexp = '', limit = string.count(str))>
Python3
line>=> 'Geek1
Geek2
Geek3'> print>(line.split())> print>(line.split(>' '>,>1>))> |
>
>
Producción:
['Geek1', 'Geek2', 'Geek3'] ['Geek1', ' Geek2 Geek3']>
Complejidad del tiempo: O(N) , ya que simplemente atraviesa la cadena y encuentra todos los espacios en blanco.
Espacio auxiliar: O(1) , ya que no se ha utilizado espacio adicional.