Próbuję użyć std :: regex w fragmencie kodu C ++ 11, ale wygląda na to, że obsługa jest trochę błędna. Przykład:
#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;
}
wyjścia:
st|mt|tr matches st? 1
st|mt|tr matches mt? 1
st|mt|tr matches tr? 0
po skompilowaniu za pomocą gcc (MacPorts gcc47 4.7.1_2) 4.7.1, albo z
g++ *.cc -o test -std=c++11
g++ *.cc -o test -std=c++0x
lub
g++ *.cc -o test -std=gnu++0x
Poza tym wyrażenie regularne działa dobrze, jeśli mam tylko dwa alternatywne wzorce, np. st|mt
Więc wygląda na to, że ostatni z jakichś powodów nie jest dopasowany. Kod działa dobrze z kompilatorem Apple LLVM.
Jakieś pomysły, jak rozwiązać ten problem?
Zaktualizuj jednym możliwym rozwiązaniem jest użycie grup do wdrożenia wielu alternatyw, np (st|mt)|tr
.
<regex>
jest niekompletna. W czym możemy Ci pomóc?regex
zapoznać się ze stanem w libstdc ++, patrz gcc.gnu.org/onlinedocs/libstdc++/manual/…<regex>
w ciągu ostatnich 3-4 lat (np. Pozostaje niezaimplementowane).<regex>
jest, że jest dostarczane przez libstdc ++ (standardową bibliotekę GCC), a niegcc
(interfejs kompilatora), jest częścią GCC (projektu). Zobacz „libstdc ++ - v3 jest rozwijane i wydawane jako część GCC” . Jeśli twoja dystrybucja zdecyduje się podzielić ją na osobny pakiet, nie ma to nic wspólnego z GCC.Odpowiedzi:
<regex>
został zaimplementowany i wydany w GCC 4.9.0.W Twojej (starszej) wersji GCC nie jest zaimplementowane .
Ten prototypowy
<regex>
kod został dodany, gdy cała obsługa GCC C ++ 0x była wysoce eksperymentalna, śledząc wczesne wersje robocze C ++ 0x i udostępniając ją ludziom do eksperymentowania. Pozwoliło to ludziom znaleźć problemy i przekazać opinię komisji normalizacyjnej przed sfinalizowaniem standardu. W tym czasie wiele osób byli wdzięczni, że miał dostęp do krwawienia krawędzi wyposażony długo zanim C ++ 11 i był gotowy przed wielu innych kompilatorów warunkiem żadnego wsparcia, a feedback naprawdę pomogło poprawić c ++ 11. To była Dobra Rzecz TM .<regex>
Kod nigdy nie był w stanie przydatnym, ale został dodany jako work-in-progress jak wiele innych bitów kodu w tym czasie. Został zarejestrowany i udostępniony innym do współpracy, jeśli chcieli, z zamiarem, że w końcu zostanie ukończony.Tak często działa open source: wypuszczaj wcześnie, publikuj często - niestety w przypadku,
<regex>
gdy dostaliśmy tylko wczesną część dobrze, a nie często część, która zakończyłaby wdrażanie.Większość części biblioteki była bardziej kompletna i jest obecnie prawie w pełni zaimplementowana, ale
<regex>
nie została, więc pozostała w tym samym niedokończonym stanie od momentu dodania.Nie był to taki zły pomysł kilka lat temu, kiedy C ++ 0x wciąż był w toku i dostarczyliśmy wiele częściowych implementacji. Nikt nie pomyślał, że pozostanie bezużyteczny przez tak długi czas, więc z perspektywy czasu może powinien był zostać wyłączony i wymagał makra lub opcji wbudowanej, aby go włączyć. Ale ten statek płynął dawno temu. Istnieją wyeksportowane symbole z libstdc ++., Więc biblioteka zależna od kodu wyrażenia regularnego, więc proste jej usunięcie (na przykład w GCC 4.8) nie byłoby trywialne.
źródło
Wykrywanie funkcji
To jest fragment do wykrycia, czy
libstdc++
implementacja jest zaimplementowana z preprocesorem C definiuje:Makra
_GLIBCXX_REGEX_DFS_QUANTIFIERS_LIMIT
jest określone wbits/regex.tcc
w4.9.x
_GLIBCXX_REGEX_STATE_LIMIT
jest określone wbits/regex_automatron.h
w5+
_GLIBCXX_RELEASE
został dodany7+
w wyniku tej odpowiedzi i jest wersją główną GCCTestowanie
Możesz to przetestować z GCC w ten sposób:
Wyniki
Oto kilka wyników dla różnych kompilatorów:
Oto smoki
Jest to całkowicie nieobsługiwane i polega na wykrywaniu prywatnych makr, które programiści GCC umieścili w
bits/regex*
nagłówkach. W każdej chwili mogli się zmienić i odejść . Miejmy nadzieję, że nie zostaną one usunięte w obecnych wydaniach 4.9.x, 5.x, 6.x, ale mogą zniknąć w wydaniach 7.x.Jeśli programiści GCC dodali
#define _GLIBCXX_HAVE_WORKING_REGEX 1
(lub coś, podpowiedź, podpowiedź, podsunięcie) w wersji 7.x, która się utrzymała, ten fragment może zostać zaktualizowany, aby uwzględnić to, a późniejsze wersje GCC będą działać z powyższym fragmentem.O ile wiem, wszystkie inne kompilatory działają
<regex>
,__cplusplus >= 201103L
ale YMMV.Oczywiście byłoby to całkowicie zepsute, gdyby ktoś zdefiniował makra
_GLIBCXX_REGEX_DFS_QUANTIFIERS_LIMIT
lub_GLIBCXX_REGEX_STATE_LIMIT
pozastdc++-v3
nagłówkami.źródło
_GLIBCXX_REGEX_IS_OK_NOW_KTHXBAI
w nagłówkach, aby nie zostało zapomniane - dzięki!W tej chwili (używając std = c ++ 14 w g ++ (GCC) 4.9.2) nadal nie akceptuje regex_match.
Oto podejście, które działa jak regex_match, ale zamiast tego używa sregex_token_iterator. Działa z g ++.
wydrukuje 1 2 3
możesz przeczytać odniesienie do sregex_token_iterator w: http://en.cppreference.com/w/cpp/regex/regex_token_iterator
źródło
std::regex_search
, zobacz wandbox.org/permlink/rLbGyYcYGNsBWsaB