Это ошибка регулярного выражения C ++ 11 - это я или компилятор?

Хорошо, это не исходная программа, в которой у меня была эта проблема, но я продублировал это в гораздо меньшем. Очень простая проблема.

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» ), похоже, тоже не работает.

54
задан Shay Guy 8 November 2011 в 18:12
поделиться