Diviser une chaîne par un délimiteur est une tâche très courante. Par exemple, nous avons une liste d’éléments d’un fichier séparés par des virgules et nous voulons des éléments individuels dans un tableau.
Presque tous les langages de programmation fournissent une fonction pour diviser une chaîne par un délimiteur.
En 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;> }> |
>
aws redshift
>
Output: Geeks for Geeks>
Complexité temporelle : Sur)
Espace auxiliaire : Sur)
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éthode 1 : Utilisation de l'API stringstream de C++
Prérequis : flux de chaînes API
L'objet Stringstream peut être initialisé à l'aide d'un objet chaîne, il est automatiquement tokenise les chaînes sur les caractères d'espace. Tout comme cin stream stringstream vous permet de lire une chaîne comme un flux de mots. Alternativement, nous pouvons également utiliser la fonction getline pour tokeniser la chaîne sur n'importe quel délimiteur de caractère unique .
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>> — extrait un mot du flux.>
Le code ci-dessous le démontre.
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>> mot) {> >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!>
Complexité temporelle : O(n)
Espace auxiliaire : O(n)
Où n est la longueur de la chaîne d'entrée.
Méthode 2 : Utilisation des API C++ find() et substr().
Prérequis: trouver une fonction et sousstr() .
Cette méthode est plus robuste et peut analyser une chaîne avec n'importe quel délimiteur , pas seulement des espaces (bien que le comportement par défaut soit de séparer les espaces.) La logique est assez simple à comprendre à partir du code ci-dessous.
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;> }> |
>
>
Output: How do you do !>
Complexité temporelle : O(n)
Espace auxiliaire : O(1)
Où n est la longueur de la chaîne d'entrée.
Méthode 3 : utilisation d'une chaîne temporaire
Si on vous indique que la longueur du délimiteur est 1, vous pouvez simplement utiliser une chaîne temporaire pour diviser la chaîne. Cela permettra d'économiser le temps système de la fonction dans le cas de la méthode 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;> }> |
>
>Sortir
acteur bélier
geeks for geeks>
Complexité temporelle : Sur)
Espace auxiliaire : Sur)
En Java :
En Java, split() est une méthode de la classe 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
comment convertir un caractère en chaîne
// 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);> >}> }> |
>
>
Sortir:
Geeks for-Geeks Geeks for Geeks>
Complexité temporelle : Sur)
Espace auxiliaire : O(1)
En Python :
La méthode split() en Python renvoie une liste de chaînes après avoir divisé la chaîne donnée par le séparateur spécifié.
// 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>))> |
>
>
Sortir:
['Geek1', 'Geek2', 'Geek3'] ['Geek1', ' Geek2 Geek3']>
Complexité temporelle : O(N) , puisqu'il parcourt simplement la chaîne pour trouver tous les espaces.
Espace auxiliaire : O(1) , puisqu'aucun espace supplémentaire n'a été utilisé.