¿Este error C ++ 11 regex me o el comstackdor?

OK, este no es el progtwig original en el que tuve este problema, pero lo dupliqué en uno mucho más pequeño. Problema muy simple.

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; } 

Comstackdo con éxito con este comando, no hay mensajes de error:

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

La última línea de g++ -v , por cierto, es:

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

Y el resultado cuando trato de ejecutarlo:

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

Ocurre de la misma manera si cambio r4 a \\s , \\w , o [az] . ¿Es esto un problema con el comstackdor? Podría creer que el motor de expresiones regulares de C ++ 11 tiene diferentes formas de decir “espacio en blanco” o “carácter de palabra”, pero los corchetes que no funcionan son una exageración. ¿Es algo que se ha solucionado en 4.6.2?

EDITAR:

Joachim Pileborg ha proporcionado una solución parcial, utilizando un parámetro regex_constants adicional para habilitar una syntax que admite corchetes, pero ni basic , extended , awk , ni ECMAScript parecen ser compatibles con los términos de escape de la barra invertida como \\s , \\w o \\t .

EDICION 2:

El uso de cadenas sin formato ( R"(\w)" lugar de "\\w" ) tampoco parece funcionar.

Actualización: ahora se implementa y se libera en GCC 4.9.0


Respuesta anterior:

La syntax de ECMAScript acepta [0-9] , \s , \w , etc., ver ECMA-262 (15.10) . Aquí hay un ejemplo con boost::regex que también usa la syntax de ECMAScript por defecto:

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

Funciona:

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

De acuerdo con el estándar C ++ 11 (28.8.2), basic_regex() usa el regex_constants::ECMAScript de forma predeterminada, por lo que debe comprender esta syntax.

¿Este error C ++ 11 regex me o el comstackdor?

gcc-4.6.1 no admite expresiones regulares de c ++ 11 (28.13) .

El error se debe a que la creación de una expresión regular utiliza de forma predeterminada la syntax de ECMAScript para la expresión, que no admite corchetes. Debe declarar la expresión con el indicador basic o extended :

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

Editar Parece que libstdc ++ (parte de GCC, y la biblioteca que maneja todo lo relacionado con C ++) todavía no implementa completamente las expresiones regulares. En su documento de estado , dicen que la gramática de expresión regular modificada de ECMAScript aún no está implementada.

El soporte de Regex mejoró entre gcc 4.8.2 y 4.9.2. Por ejemplo, la expresión regular =[AZ]{3} me falló con:

Error de Regex

Después de actualizar a gcc 4.9.2, funciona como se esperaba.