104

C++11のコードでstd::regexを使用しようとしていますが、サポートが少しバグがあるようです。例:

#include <regex>
#include <iostream>

int main (int argc, const char * argv[]) {
    std::regex r("st|mt|tr");
    std::cerr << "st|mt|tr" << " matches st? " << std::regex_match("st", r) << std::endl;
    std::cerr << "st|mt|tr" << " matches mt? " << std::regex_match("mt", r) << std::endl;
    std::cerr << "st|mt|tr" << " matches tr? " << std::regex_match("tr", r) << std::endl;
}

出力:

st|mt|tr matches st? 1
st|mt|tr matches mt? 1
st|mt|tr matches tr? 0

gcc(MacPorts gcc47 4.7.1_2)4.7.1でコンパイルした場合、

g++ *.cc -o test -std=c++11
g++ *.cc -o test -std=c++0x

また

g++ *.cc -o test -std=gnu++0x

さらに、たとえば、2つの代替パターンしかない場合、正規表現はうまく機能するst|mtため、何らかの理由で最後のパターンが一致していないように見えます。このコードは、AppleLLVMコンパイラでうまく機能します。

問題を解決する方法について何かアイデアはありますか?

考えられる解決策の1つを更新するには、グループを使用して複数の選択肢を実装します(st|mt)|tr

4

3 に答える 3

174

<regex>GCC 4.9.0 で実装およびリリースされました。

GCC の (古い) バージョンでは、実装されていません

このプロトタイプコードは、GCC の C++0x サポートがすべて非常に<regex>実験的であったときに追加され、初期の C++0x ドラフトを追跡し、人々が実験できるようになりました。これにより、人々は問題を発見し、標準が完成する前に標準委員会にフィードバックすることができました。当時、C++11 が完成するずっと前に、また他の多くのコンパイラがサポートを提供する前に、最先端の機能にアクセスできたことに多くの人が感謝していました。そのフィードバックは、C++11 の改善に本当に役立ちました。これはGood Thing TMでした。

コードは決して有用な状態ではありませんでした<regex>が、当時の他の多くのコードと同様に進行中の作業として追加されました。それはチェックインされ、最終的に完成することを意図して、必要に応じて他の人が共同作業できるようになりました。

多くの場合、これがオープンソースのしくみです:早期にリリースし、頻繁にリリース<regex>します。

ライブラリの大部分はより完全になり、現在はほぼ完全に実装され<regex>ていますが、そうではなかったため、追加されてから未完成のままでした。

まじめな話、「false を返す」だけの regex_search の実装を出荷するのが良い考えだと誰が考えたのでしょうか?

数年前、C++0x がまだ進行中の作業であり、多くの部分的な実装を出荷したとき、それはそれほど悪い考えではありませんでした。誰もそれが長い間使用できないとは思っていなかったので、後から考えると、おそらく無効にされるべきであり、有効にするにはマクロまたはビルド時のオプションが必要でした. しかし、その船はずっと前に出航しました。regex コードに依存するlibstdc++.soライブラリからエクスポートされたシンボルがあるため、単純に (たとえば GCC 4.8 で) 削除することは簡単ではありませんでした。

于 2012-09-30T21:45:38.863 に答える