Это c++11 regex ошибка меня или компилятора?


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

главная.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?

EDIT:

Йоахим Пилеборг предоставил частичное решение, используя дополнительный regex_constants параметр для включения синтаксиса, который поддерживает квадратные скобки, но не basic,extended,awk, ни ECMAScript кажется для поддержки обратной косой черты-экранированные термины, такие как s,w или t.

EDIT 2:

использование необработанных строк (R"(w)" вместо "w") не работает.

3 52

3 ответа:

обновление: <regex> теперь реализован и выпущен в GCC 4.9.0


ответ:

синтаксис ECMAScript принимает [0-9],\s,\w и т. д., см. ECMA-262 (15.10). Вот пример с boost::regex который также использует синтаксис ECMAScript по умолчанию:

#include <boost/regex.hpp>

int main(int argc, char* argv[]) {
  using namespace boost;
  regex e("[0-9]");
  return argc > 1 ? !regex_match(argv[1], e) : 2;
}

работает:

$ g++ -std=c++0x *.cc -lboost_regex && ./a.out 1

согласно стандарту C++11 (28.8.2) basic_regex() использует regex_constants::ECMAScript флаг по умолчанию, поэтому он должен понимать этот синтаксис.

это c++11 regex ошибка меня или компилятора?

gcc-4.6.1 не поддерживает регулярные выражения c++11 (28.13).

ошибка заключается в том, что при создании регулярного выражения по умолчанию используется синтаксис ECMAScript для выражения, который не поддерживает скобки. Вы должны объявить выражение с помощью basic или extended флаг:

std::regex r4("[0-9]", std::regex_constants::basic);

Edit похоже, что libstdc++ (часть GCC и библиотека, которая обрабатывает все материалы C++) еще не полностью реализует регулярные выражения. В их документ говорят, что измененное регулярное выражение ECMAScript грамматика пока не реализована.

поддержка регулярных выражений улучшена между gcc 4.8.2 и 4.9.2. Например, регулярное выражение =[A-Z]{3} не для меня с:

ошибка выражения

после обновления до gcc 4.9.2, он работает, как ожидалось.