Это 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 ответа:
обновление:
<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 грамматика пока не реализована.