2011-09-28 9 views
13

Czy ktoś mógłby wyjaśnić różnice między tymi dwoma? Które lepiej byłoby się teraz nauczyć? W jaki sposób transfer wiedzy z jednego do drugiego i na odwrót?Boost.Regex vs C++ 11 Regex

+5

Uczenie się standardowego sposobu nigdy nie jest złe. –

+3

Należy zachować ostrożność w bibliotece standardowej C++ 11 Regex, ponieważ nadal nie jest ona w pełni zaimplementowana przez GCC: http://stackoverflow.com/questions/4716680/c0x-regex-in-gcc –

Odpowiedz

10

Biblioteka regex boost zrobiła to w C++ 0x, więc domyślam się, że powoli zostanie usunięta z boost. Jednak użycie boost jest dobre, ponieważ nadal można go używać z kompilatorami bez obsługi C++ 0x. Więc naprawdę zależy od ciebie.

+3

Tak, ale można migrować Boost.Regex oparty na C++ 11 Regex z prostym 's/boost ::/std ::/g'? –

+0

@Rob: Wyobrażam sobie, że to zależy od tego, czy korzystasz z pomocy Boost.Regex na OIOM. – ildjarn

7

Jedną z głównych różnic jest to, że C++ 11 nie udostępnia składni Perla dla wyrażeń regularnych. Tak więc, jeśli masz tendencję do używania składni Perla, musisz użyć biblioteki Boost :: Regex.

+0

Tak, istnieje składnia Perla dla wyrażenia regularnego: Istnieje wyrejestrowanie ECMAScript i wyrażenie regularne ECMAScript jest takie samo, jak w przypadku wyrażenia Perl http://ecma-international.org/ecma-262/5.1/#sec-15.10 – BenjaminB

+5

@ Ubiquité Nie jesteś poprawny. Podany link mówi "zamodelowany po". Propozycja [C++ TR1 dla ] (http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2003/n1429.htm#syntax_discussion) używa bardzo podobnego frazowania "opartego na". Wyrażenia regularne ECMAScript to nie to samo co wyrażenia regularne Perla - Perl oferuje więcej funkcji i trochę innej składni. –

+1

@PatrickNiedzielski: Masz rację, niestety Boost.Regex zdefiniował 'perl' jako ekwiwalent' ECMAScript' http://www.boost.org/doc/libs/1_53_0/libs/regex/doc/html/boost_regex/ref/ syntax_option_type/syntax_option_type_perl.html. – kennytm

0

Przynajmniej w Visual Studio 2013 ta i powiązane nazwy (cmatch, regex_match) są takie same w obu obszarach nazw. Mają również ten sam (lub podobny?) Interfejs.

Po prostu możesz zmienić przestrzeń nazw i ten sam kod zostanie skompilowany z innym wyrażeń regularnych bez ostrzeżenia i błędów. I powinno działać tak samo.

P.S. Wolałabym std :: regex, ponieważ jest częścią C++ 11, a boost :: regex jest biblioteką innej firmy. Jestem pewien, że kilka lat później, boost usunie wsparcie dla boost :: regex.