OK, ce n'est pas le programme original dans lequel j'ai eu ce problème, mais je l'ai reproduit dans un programme beaucoup plus petit. Problème très simple.
main.cpp :
#include <iostream>
#include <regex>
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;
}
Compilé avec succès avec cette commande, aucun message d'erreur :
$ g++ -std=c++0x main.cpp
La dernière ligne de g++ -v
d'ailleurs, l'est :
gcc version 4.6.1 (Ubuntu/Linaro 4.6.1-9ubuntu3)
Et le résultat lorsque j'essaie de l'exécuter :
$ ./a.out
S works.
. works.
.+ works.
terminate called after throwing an instance of 'std::regex_error'
what(): regex_error
Aborted
Cela se produit de la même manière si je change r4 en \\s
, \\w
o [a-z]
. S'agit-il d'un problème avec le compilateur ? Je pourrais croire que le moteur regex de C++11 a différentes façons de dire "espace blanc" ou "caractère de mot", mais des crochets qui ne fonctionnent pas, c'est un peu exagéré. Est-ce un problème qui a été corrigé dans la version 4.6.2 ?
EDITAR:
Joachim Pileborg a fourni une solution partielle, en utilisant un supplément de regex_constants
pour activer une syntaxe qui prend en charge les crochets, mais ni le paramètre basic
, extended
, awk
ni ECMAScript
semblent prendre en charge les termes en antislash, tels que \\s
, \\w
o \\t
.
EDIT 2 :
L'utilisation de chaînes de caractères brutes ( R"(\w)"
au lieu de "\\w"
) ne semble pas fonctionner non plus.