Это ошибка C ++ 11 для меня или компилятор? - PullRequest
53 голосов
/ 09 ноября 2011

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

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

Ответы [ 3 ]

32 голосов
/ 09 ноября 2011

Обновление: <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 для меня или компилятора?

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

27 голосов
/ 09 ноября 2011

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

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

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

6 голосов
/ 04 декабря 2014

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

Ошибка регулярного выражения

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...