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
パラメーターを使用して部分的なソリューションを提供しましたが、basic
、extended
、awk
、またはECMAScript
も\\s
、\\w
、\\t
などのバックスラッシュエスケープされた用語をサポートします。
編集2:
生の文字列("\\w"
の代わりにR"(\w)"
)を使用しても機能しないようです。
更新:_<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正規表現エラーですか、それともコンパイラですか?
エラーは、デフォルトで正規表現を作成すると、式にECMAScript構文が使用されるためです。この構文は、括弧をサポートしていません。 basic
またはextended
フラグを使用して式を宣言する必要があります。
std::regex r4("[0-9]", std::regex_constants::basic);
Editlibstdc ++(GCCの一部であり、すべてのC++のものを処理するライブラリ)はまだ正規表現を完全には実装していないようです。 ステータスドキュメント では、修正されたECMAScript正規表現文法はまだ実装されていません。
正規表現のサポートは、gcc 4.8.2と4.9.2の間で改善されました。たとえば、正規表現=[A-Z]{3}
私のために失敗していました:
正規表現エラー
Gcc 4.9.2にアップグレードした後、期待どおりに動作します。