ОК, это не оригинальная программа, в которой у меня была эта проблема, но я продублировал ее в гораздо меньшей.Очень простая проблема.
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]
.Это проблема с компилятором?Я мог бы поверить, что движок регулярных выражений в C ++ 11 по-разному говорит «пробел» или «символ слова», но не работающие квадратные скобки - это натяжка.Это исправлено в 4.6.2?
РЕДАКТИРОВАТЬ:
Йоахим Пилеборг предоставил частичное решение, используя дополнительный параметр regex_constants
для включения синтаксисакоторый поддерживает квадратные скобки, но ни basic
, extended
, awk
, ни ECMAScript
, кажется, не поддерживают экранированные от обратной косой черты термины, такие как \\s
, \\w
или \\t
.
EDIT 2:
Использование необработанных строк (R"(\w)"
вместо "\\w"
), похоже, тоже не работает.