web-dev-qa-db-ja.com

これはC ++ 11正規表現エラーですか、それともコンパイラですか?

OK、これは私がこの問題を抱えていた元のプログラムではありませんが、もっと小さなものに複製しました。非常に単純な問題。

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で修正されたものですか?

編集:

Joachim Pileborgは、角括弧をサポートする構文を有効にする追加のregex_constantsパラメーターを使用して部分的なソリューションを提供しましたが、basicextendedawk、またはECMAScript\\s\\w\\tなどのバックスラッシュエスケープされた用語をサポートします。

編集2:

生の文字列("\\w"の代わりにR"(\w)")を使用しても機能しないようです。

54
Shay Guy

更新:_<regex>_がGCC 4.9.0で実装およびリリースされました


古い答え:

ECMAScript構文は_[0-9]_、_\s_、_\w_などを受け入れます。 ECMA-262(15.10) を参照してください。デフォルトでECMAScript構文も使用する_boost::regex_の例を次に示します。

_#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)をサポートしません

33
jfs

エラーは、デフォルトで正規表現を作成すると、式にECMAScript構文が使用されるためです。この構文は、括弧をサポートしていません。 basicまたはextendedフラグを使用して式を宣言する必要があります。

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

Editlibstdc ++(GCCの一部であり、すべてのC++のものを処理するライブラリ)はまだ正規表現を完全には実装していないようです。 ステータスドキュメント では、修正されたECMAScript正規表現文法はまだ実装されていません。

28

正規表現のサポートは、gcc 4.8.2と4.9.2の間で改善されました。たとえば、正規表現=[A-Z]{3}私のために失敗していました:

正規表現エラー

Gcc 4.9.2にアップグレードした後、期待どおりに動作します。

7
Drew Noakes