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