3

C++11 正規表現を使用して、一致する中括弧の内容を抽出したいとします。たとえば、{foo}は正常に一致し、 を使用しmatch_resultてコンテンツを抽出できます。単純に思えますが、次のコードは私が望んでいることをまったく実行しません

std::string foo("{foo}");
std::regex r("\\{(.*)\\}");
std::smatch m;
bool result = regex_match(foo, m, r); // result returns true

cout << m[0] << endl; // prints: {foo}
cout << m[1] << endl; // prints: {foo} instead of just foo as I would expect

最初のキャプチャ グループであることを考えると、中かっこなしでm[1]返すべきではありませんか?foo

編集:この質問の重要な情報は、私が使用しているコンパイラが GCC 4.6.3 (現在、Ubuntu 12.04 LTS の最新のリポジトリ バージョン) であることです。その答えは、GCC での正規表現のサポートがいかに貧弱であるかを正確に示しています。

4

1 に答える 1

4

あなたのパターンは正しいです。あなたのコードは、いくつかの「std」があちこちで欠落している(「cout」、「endl」、およびregex_matchの場合)、または少なくとも矛盾している(「名前空間stdを使用している」と仮定して)ほとんど正しいです。

さらに、Visual Studio 2012 では、コードは期待どおりの結果を出力します。2010 は試していませんが、そこでも実行されていると思われます (Microsoft は 2010 年に TR1 を組み込みました)。

gccを使用していると思われます。@Artyom が指摘したように、gcc/libstdc++ では実装されていません。警告なしで正常にコンパイルされますが、間違った結果が得られます。gcc はすべての分野で Microsoft よりも優れているという一般的な信念にもかかわらず、これは正規表現には当てはまりません。

ここで gcc の正規表現のステータスを見つけます: http://gcc.gnu.org/onlinedocs/libstdc++/manual/status.html#status.iso.200x

于 2012-11-05T12:31:27.993 に答える