ОК, это не оригинальная программа, в которой я столкнулся с этой проблемой, но я продублировал ее намного меньше. Очень простая проблема.
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;
}
Скомпилировано с этой командой успешно, никаких сообщений об ошибках:
$ g++ -std=c++0x main.cpp
Последняя строка g++ -v, кстати, есть:
gcc version 4.6.1 (Ubuntu/Linaro 4.6.1-9ubuntu3)
И результат, когда я пытаюсь запустить его:
$ ./a.out
S works.
. works.
.+ works.
terminate called after throwing an instance of 'std::regex_error'
what(): regex_error
Aborted
Это происходит так же, если я меняю r4 на \\s, \\w или [a-z]. Это проблема с компилятором? Возможно, я могу поверить, что движок регулярных выражений С++ 11 имеет разные способы сказать "пробел" или "символ слова", но квадратные скобки не работают. Это то, что было исправлено в 4.6.2?
EDIT:
Joachim Pileborg предоставил частичное решение, используя дополнительный параметр regex_constants, чтобы включить синтаксис, поддерживающий квадратные скобки, но ни basic, extended, awk, ни ECMAScript, похоже, не поддерживают обратную косую черту, (\\s, \\w или \\t).
ИЗМЕНИТЬ 2:
Использование исходных строк (R"(\w)" вместо "\\w") тоже не работает.