ОК, это не оригинальная программа, в которой я столкнулся с этой проблемой, но я продублировал ее намного меньше. Очень простая проблема.
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"
) тоже не работает.