Я пытаюсь использовать std:: regex в коде С++ 11, но оказывается, что поддержка немного глючит. Пример:
#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
Кроме того, регулярное выражение работает хорошо, если у меня есть только два альтернативных шаблона, например. st|mt
, поэтому похоже, что последнее не соответствует по некоторым причинам. Код хорошо работает с компилятором Apple LLVM.
Любые идеи о том, как решить проблему?
Обновить одно из возможных решений - использовать группы для реализации множества альтернатив, например. (st|mt)|tr
.