2009-06-14 20 views
9

Sto cercando di imparare un po 'di C++ da zero al momento.
Sono molto esperto in python, perl, javascript, ma ho solo incontrato C++ brevemente, in un'impostazione di classe in passato. Per favore scusami l'ingenuità della mia domanda.C++ tokenize una stringa utilizzando un'espressione regolare

Vorrei dividere una stringa utilizzando un'espressione regolare ma non ho avuto molta fortuna nel trovare un chiaro, definitivo, efficiente e completo esempio di come farlo in C++.

in Perl questo è l'azione è comune e, quindi, può essere realizzato in modo banale,

/home/me$ cat test.txt 
this is aXstringYwith, some problems 
and anotherXY line with similar issues 

/home/me$ cat test.txt | perl -e' 
> while(<>){ 
> my @toks = split(/[\sXY,]+/); 
> print join(" ",@toks)."\n"; 
> }' 
this is a string with some problems 
and another line with similar issues 

Mi piacerebbe sapere il modo migliore per realizzare l'equivalente in C++.

MODIFICA:
Penso di aver trovato quello che stavo cercando nella libreria boost, come indicato di seguito.

boost regex-token-iterator (perché sottolineatura non funzionano?)

Credo che non sapevo cosa cercare.


#include <iostream> 
#include <boost/regex.hpp> 

using namespace std; 

int main(int argc) 
{ 
    string s; 
    do{ 
    if(argc == 1) 
     { 
     cout << "Enter text to split (or \"quit\" to exit): "; 
     getline(cin, s); 
     if(s == "quit") break; 
     } 
    else 
     s = "This is a string of tokens"; 

    boost::regex re("\\s+"); 
    boost::sregex_token_iterator i(s.begin(), s.end(), re, -1); 
    boost::sregex_token_iterator j; 

    unsigned count = 0; 
    while(i != j) 
     { 
     cout << *i++ << endl; 
     count++; 
     } 
    cout << "There were " << count << " tokens found." << endl; 

    }while(argc == 1); 
    return 0; 
} 

+1

si dovrebbe aggiungere il "che si trova da solo" parte come una risposta alla propria domanda invece di averlo far parte della tua domanda ... anche citare che avete trovato e ha pubblicato la risposta. se qualcun altro arriva e trova questa domanda utile ... vorranno vedere la risposta selezionata dalla comunità insieme a quella scelta. La tua risposta potrebbe non essere la scelta migliore della comunità. –

risposta

14

Le librerie Boost sono di solito una buona scelta, in questo caso Boost.Regex. C'è anche an example per dividere una stringa in token che già fa ciò che vuoi. In sostanza si tratta di qualcosa di simile:

boost::regex re("[\\sXY]+"); 
std::string s; 

while (std::getline(std::cin, s)) { 
    boost::sregex_token_iterator i(s.begin(), s.end(), re, -1); 
    boost::sregex_token_iterator j; 
    while (i != j) { 
    std::cout << *i++ << " "; 
    } 
    std::cout << std::endl; 
} 
+0

anche se ho trovato il mio modo di regex_token_iterator dal post di oberoi, ho scelto questo come risposta perché fornisce un esempio conciso e funzionante e include il link alla pagina di boost appropriata. Saluti. –

1

A differenza di Perl, le espressioni regolari non sono "incorporate" in C++.

È necessario utilizzare una libreria esterna, ad esempio PCRE.

+0

contiene anche una funzione 'split'? python contiene un modulo di espressione regolare predefinito, 're', che fornisce funzioni di convenienza per la divisione delle stringhe. mi chiedo se questo funziona allo stesso modo? –

+0

Questa risposta era vera quando inviata, ma non è più vera con la disponibilità di C++ 11. '#include ' – Justin

2

Se si vuole ridurre al minimo l'uso di iteratori, e pithify il codice, il seguente dovrebbe funzionare:

#include <string> 
#include <iostream> 
#include <boost/regex.hpp> 

int main() 
{ 
    const boost::regex re("[\\sXY,]+"); 

    for (std::string s; std::getline(std::cin, s);) 
    { 
    std::cout << regex_replace(s, re, " ") << std::endl; 
    } 

} 
Problemi correlati