2013-05-23 17 views
5

Quindi il mio professore mi ha dato un lavoro con regex in C++.Compilare ed eseguire regex in C++ usando eclipse

Così ho provato a scrivere il mio codice in eclissi (sto usando linux (ubuntu 12.04)).

così ho preso il codice:

// regex_search example 
#include <iostream> 
#include <string> 
#include <regex> 

int main() 
{ 
    std::string s ("this subject has a submarine as a subsequence"); 
    std::smatch m; 
    std::regex e ("\\b(sub)([^ ]*)"); // matches words beginning by "sub" 

    std::cout << "Target sequence: " << s << std::endl; 
    std::cout << "Regular expression: /\\b(sub)([^ ]*)/" << std::endl; 
    std::cout << "The following matches and submatches were found:" << std::endl; 

    while (std::regex_search (s,m,e)) { 
    for (auto x:m) std::cout << x << " "; 
    std::cout << std::endl; 
    s = m.suffix().str(); 
    } 

    return 0; 
} 

Come potete vedere si tratta di un semplice codice per lavorare con espressioni regolari.

così cerco di costruirla e eclisse mi dà un errore:

Type 'smatch' could not be resolved 

e anche:

Type 'std::regex' could not be resolved 

qual è il problema?

Ho tentato di aggiungere la flag -std = C++ 0x nella posizione appropriata (proprietà-> c/C++ build -> Varie) e non succede nulla.

forse sto sbagliando?

forse devo aggiungere un collegamento alla libreria come in pthread?

+0

Quale versione di GCC sono in esecuzione? – Nick

+0

Probabilmente stai usando gcc 4.7.2 (o forse quello precedente) con quella versione di Ubuntu? Le espressioni regolari non sono implementate in quella versione. (Non sono sicuro di quanto siano lontani adesso. L'ultima prova che ho visto di qualsiasi attività è stata qualche vago commento su una mailing list di gennaio). – BoBTFish

+0

@Nick I cosa sto usando la versione 4.7.1 –

risposta

0

regex viene aggiunto sotto lo spazio dei nomi std::tr1. si prega di dichiarare l'oggetto per l'espressione regolare come std::tr1::regex, dovrebbe funzionare

+1

Grazie a DevZer0, ma davvero non capisco qual è il cambiamento effettivo che hai fatto tranne il cambio di carattere? – Zeeshan

0

La bandiera non è sufficiente, si deve aggiungere il simbolo del preprocessore "____GXX_EXPERIMENTAL_CXX0X____" in "C/C++ Generale -> Percorsi e simboli -> Simboli - > Anche GNU C++. Per dettagli, fare riferimento alla seguente domanda: Eclipse CDT C++11/C++0x support. È anche nel wiki di Eclipse: http://wiki.eclipse.org/CDT/User/FAQ#CDT_does_not_recognize_C.2B.2B11_features. Il secondo collegamento presenta anche un collegamento aggiuntivo a una pagina del forum che descrive un'opzione "nascosta" (http://www.eclipse.org/forums/index.php/mv/msg/373462/909018/#msg_909018). Se si configura il compilatore con l'opzione "nascosta" come descritto nel link, funziona ancora dopo aver rimosso di nuovo il flag "____GXX_EXPERIMENTAL_CXX0X____". Almeno per me ha funzionato in questo modo (Eclipse Juno 4.2.2 e GCC 4.7.2).

3

La mia configurazione:

Sistema operativo: Ubuntu 14.04 Compiler: GCC 4.8.2 IDE: Eclipse 3.8.1

Problema:

Ho incluso regex (#include <regex>) al mio file di intestazione ma il mio IDE continua a lamentarsi che il tipo di 'qualcosa' non può essere risolto. Ho provato a utilizzare spazi dei nomi come std :: e std :: tr1, come hanno consigliato le persone di google, senza successo.

Soluzione:

soluzione è semplice come il problema stesso. Se date un'occhiata a usr/include/C++/4.8 noterete che il file regex nella cartella principale è una sorta di stub. Tuttavia c'è un altro file regex nella cartella/tr1.

Il trucco è che invece di scrivere #include <regex>, si dovrebbe scrivere #include <tr1/regex>

Dopo che siete in grado di utilizzare regex attraverso std :: tr1 :: namespace.

Ad esempio come questo: std :: tr1 :: smatch

Speranza che aiuta!

© http://antaumus.blogspot.com/2014/08/how-to-use-regex-with-gcc-482.html

Problemi correlati