[英]Is this C++11 regex error me or the compiler?
好吧,這不是我遇到這個問題的原始程序,但是我把它復制得更小了。 非常簡單的問題。
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中得到修復?
編輯:
Joachim Pileborg提供了一個部分解決方案,使用額外的regex_constants
參數來啟用支持方括號的語法,但basic
, extended
, awk
和ECMAScript
似乎都不支持反斜杠轉義術語,如\\\\s
, \\\\w
或\\\\t
。
編輯2:
使用原始字符串( R"(\\w)"
而不是"\\\\w"
)似乎也不起作用。
更新: <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正則表達式錯誤我或編譯器?
該錯誤是因為默認情況下創建正則表達式使用表達式的ECMAScript語法,該語法不支持括號。 您應該使用basic
或extended
標志聲明表達式:
std::regex r4("[0-9]", std::regex_constants::basic);
編輯看起來像libstdc ++(GCC的一部分,以及處理所有C ++東西的庫)還沒有完全實現正則表達式。 在他們的狀態文檔中,他們說修改后的ECMAScript正則表達式語法尚未實現。
正則表達式支持在gcc 4.8.2和4.9.2之間得到改善。 例如,正則表達式=[AZ]{3}
對我來說失敗了:
正則表達式錯誤
升級到gcc 4.9.2后,它按預期工作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.