È questo regex C ++ 11 errore me o il compilatore?

OK, questo non è il programma originale in cui ho avuto questo problema, ma l’ho duplicato in uno molto più piccolo. Problema molto semplice

main.cpp:

#include  #include  using namespace std; int main() { regex r1("S"); printf("S works.\n"); regex r2("."); printf(". works.\n"); regex r3(".+"); printf(".+ works.\n"); regex r4("[0-9]"); printf("[0-9] works.\n"); return 0; } 

Compilato con successo con questo comando, nessun messaggio di errore:

 $ g++ -std=c++0x main.cpp 

L’ultima riga di g++ -v , a proposito, è:

 gcc version 4.6.1 (Ubuntu/Linaro 4.6.1-9ubuntu3) 

E il risultato quando provo a eseguirlo:

 $ ./a.out S works. . works. .+ works. terminate called after throwing an instance of 'std::regex_error' what(): regex_error Aborted 

Succede allo stesso modo se cambio r4 in \\s , \\w o [az] . È un problema con il compilatore? Potrei essere in grado di credere che il motore regex di C ++ 11 abbia diversi modi di dire “spazio bianco” o “carattere parola”, ma le parentesi quadre non funzionano è un tratto. È qualcosa che è stato risolto in 4.6.2?

MODIFICARE:

Joachim Pileborg ha fornito una soluzione parziale, usando un parametro extra regex_constants per abilitare una syntax che supporta parentesi quadre, ma né basic , extended , awk , né ECMAScript sembrano supportare i termini con escape alla rovescia come \\s , \\w o \\t .

MODIFICA 2:

L’utilizzo di stringhe non elaborate ( R"(\w)" invece di "\\w" ) non sembra funzionare neanche.

Aggiornamento: è ora implementato e rilasciato in GCC 4.9.0


Vecchia risposta:

La syntax ECMAScript accetta [0-9] , \s , \w , ecc., Vedi ECMA-262 (15.10) . Ecco un esempio di boost::regex che utilizza anche la syntax ECMAScript per impostazione predefinita:

 #include  int main(int argc, char* argv[]) { using namespace boost; regex e("[0-9]"); return argc > 1 ? !regex_match(argv[1], e) : 2; } 

Funziona:

 $ g++ -std=c++0x *.cc -lboost_regex && ./a.out 1 

Secondo lo standard C ++ 11 (28.8.2), basic_regex() usa regex_constants::ECMAScript per default, quindi deve capire questa syntax.

È questo regex C ++ 11 errore me o il compilatore?

gcc-4.6.1 non supporta le espressioni regolari di c ++ 11 (28.13) .

L’errore è dovuto al fatto che la creazione di un’espressione regolare per impostazione predefinita utilizza la syntax ECMAScript per l’espressione, che non supporta le parentesi. Dovresti dichiarare l’espressione con il flag di basic o extended :

 std::regex r4("[0-9]", std::regex_constants::basic); 

Modifica Sembra che libstdc ++ (parte di GCC e la libreria che gestisce tutto il materiale C ++) non implementa ancora completamente le espressioni regolari. Nel loro documento di stato dicono che la grammatica delle espressioni regolari modificata di ECMAScript non è ancora stata implementata.

Il supporto Regex è migliorato tra gcc 4.8.2 e 4.9.2. Ad esempio, la regex =[AZ]{3} non ha funzionato per me con:

Errore Regex

Dopo l’aggiornamento a gcc 4.9.2, funziona come previsto.