Я пытаюсь использовать std :: regex в фрагменте кода C ++ 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
.
<regex>
неполная. Чем мы можем вам помочь?regex
узнать о статусе в libstdc ++, см. Gcc.gnu.org/onlinedocs/libstdc++/manual/…<regex>
за последние 3-4 года в libstdc ++ ничего не изменилось (например, он остается нереализованным).<regex>
он предоставляется libstdc ++ (стандартная библиотека GCC) неgcc
(интерфейс компилятора), он является частью GCC (проекта). См. «Libstdc ++ - v3 разработан и выпущен как часть GCC» . Если ваш дистрибутив решит разделить его на отдельный пакет, это не имеет ничего общего с GCC.Ответы:
<regex>
был реализован и выпущен в GCC 4.9.0.В вашей (более старой) версии GCC это не реализовано .
Этот прототип
<regex>
код был добавлен , когда все поддержка C ++ 0x GCC было весьма экспериментальным, отслеживание ранних C ++ 0x проектов и быть доступны для людей , чтобы экспериментировать с. Это позволяло людям находить проблемы и давать обратную связь комитету по стандарту до того, как стандарт был окончательно доработан. В то время многие люди были благодарны за доступ к новейшим функциям задолго до того, как был завершен C ++ 11 и до того, как многие другие компиляторы предоставили какую-либо поддержку, и эта обратная связь действительно помогла улучшить C ++ 11. Это была хорошая вещь TM .<regex>
Код никогда не был в состоянии полезного, но был добавлен в качестве работы в прогресс , как и многие другие биты кода в то время. Он был зарегистрирован и предоставлен другим пользователям для совместной работы, если они захотят, с намерением, чтобы в конечном итоге он был завершен.Вот как часто работает открытый исходный код: выпускать раньше, выпускать часто - к сожалению, в случае, если
<regex>
мы получили правильную только раннюю часть, а не ту частую, которая завершила бы реализацию.Большинство частей библиотеки были более полными и теперь почти полностью реализованы, но
<regex>
этого не произошло, поэтому с момента добавления она оставалась в том же незавершенном состоянии.Это не было такой уж плохой идеей несколько лет назад, когда работа над C ++ 0x еще не завершена, и мы отправили множество частичных реализаций. Никто не думал, что он так долго будет оставаться непригодным для использования, поэтому, оглядываясь назад, возможно, его следовало отключить и для его включения требовался макрос или встроенный параметр времени. Но этот корабль давно отплыл. Существуют экспортированные символы из libstdc ++. Поэтому библиотека, которая зависит от кода регулярного выражения, поэтому простое ее удаление (например, в GCC 4.8) было бы нетривиальным.
источник
Обнаружение функции
Это фрагмент кода, позволяющий определить,
libstdc++
реализована ли реализация с помощью препроцессора C, определяемого:Макросы
_GLIBCXX_REGEX_DFS_QUANTIFIERS_LIMIT
будет определен вbits/regex.tcc
в4.9.x
_GLIBCXX_REGEX_STATE_LIMIT
будет определен вbits/regex_automatron.h
в5+
_GLIBCXX_RELEASE
был добавлен в7+
результате этого ответа и является основной версией GCCТестирование
Вы можете проверить это с помощью GCC следующим образом:
Полученные результаты
Вот некоторые результаты для разных компиляторов:
Вот драконы
Это полностью не поддерживается и полагается на обнаружение частных макросов, которые разработчики GCC поместили в
bits/regex*
заголовки. Они могли измениться и уйти в любой момент . Надеюсь, они не будут удалены в текущих выпусках 4.9.x, 5.x, 6.x, но могут исчезнуть в выпусках 7.x.Если разработчики GCC добавили
#define _GLIBCXX_HAVE_WORKING_REGEX 1
(или что-то, подталкивающее подталкивание подсказки) в выпуске 7.x, который сохранился, этот фрагмент можно было бы обновить, включив его, и более поздние выпуски GCC будут работать с фрагментом выше.Насколько я знаю, все остальные компиляторы имеют работу ,
<regex>
когда ,__cplusplus >= 201103L
но YMMV.Очевидно, это полностью сломалось бы, если бы кто-то определил макросы
_GLIBCXX_REGEX_DFS_QUANTIFIERS_LIMIT
или_GLIBCXX_REGEX_STATE_LIMIT
внеstdc++-v3
заголовков.источник
_GLIBCXX_REGEX_IS_OK_NOW_KTHXBAI
заголовков, чтобы это не забылось - спасибо!В настоящий момент (используя std = c ++ 14 в g ++ (GCC) 4.9.2) все еще не принимает regex_match.
Вот подход, который работает как regex_match, но вместо этого использует sregex_token_iterator. И это работает с g ++.
он напечатает 1 2 3
вы можете прочитать ссылку sregex_token_iterator в: http://en.cppreference.com/w/cpp/regex/regex_token_iterator
источник
std::regex_search
, см. Wandbox.org/permlink/rLbGyYcYGNsBWsaB