簡體   English   中英

這個C ++ 11正則表達式錯誤我或編譯器?

[英]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參數來啟用支持方括號的語法,但basicextendedawkECMAScript似乎都不支持反斜杠轉義術語,如\\\\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正則表達式錯誤我或編譯器?

gcc-4.6.1不支持c ++ 11正則表達式(28.13)

該錯誤是因為默認情況下創建正則表達式使用表達式的ECMAScript語法,該語法不支持括號。 您應該使用basicextended標志聲明表達式:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM