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
。