Poznaj swoje smaki regularne
Zaskakująca jest liczba osób, które uważają, że wyrażenia regularne są zasadniczo niezależne od języka. Istnieją jednak dość znaczne różnice między smakami, a szczególnie w przypadku golfa kodowego dobrze jest znać kilka z nich i ich ciekawe funkcje, dzięki czemu możesz wybrać najlepsze dla każdego zadania. Oto przegląd kilku ważnych smaków i ich odróżnienie od innych. (Ta lista nie może być naprawdę kompletna, ale daj mi znać, jeśli coś przeoczyłem.)
Perl i PCRE
Wrzucam je do jednego garnka, ponieważ nie znam się zbytnio na smaku Perla i są one w większości równoważne (w końcu PCRE jest dla wyrażeń regularnych kompatybilnych z Perlem). Główną zaletą smaku Perla jest to, że można wywoływać kod Perla z wyrażenia regularnego i podstawiania.
- Rekurencja / podprogramy . Prawdopodobnie najważniejsza cecha golfa (która występuje tylko w kilku odmianach).
- Wzorce warunkowe
(?(group)yes|no).
- Podpory zmiana przypadku w ciągu zastępowania z
\l, \u, \Li \U.
- PCRE zezwala na zmianę w spojrzeniach, gdzie każda alternatywa może mieć inną (ale stałą) długość. (Większość smaków, w tym Perl, wymaga spojrzenia, aby mieć ogólną stałą długość).
\G aby zakotwiczyć mecz do końca poprzedniego meczu.
\K zresetować początek meczu
- PCRE obsługuje zarówno właściwości znaków, jak i skrypty Unicode .
\Q...\Eaby uniknąć dłuższych serii znaków. Przydatne, gdy próbujesz dopasować ciąg znaków, który zawiera wiele metaznaków.
.NETTO
Jest to prawdopodobnie najsilniejszy smak, z bardzo niewielkimi niedociągnięciami.
Jednym z istotnych niedociągnięć pod względem golfowym jest to, że nie obsługuje kwantyfikatorów dzierżawczych, jak niektóre inne smaki. Zamiast tego .?+będziesz musiał pisać (?>.?).
Jawa
- Z powodu błędu (patrz Dodatek) Java obsługuje ograniczony typ look -indind o zmiennej długości: możesz szukać do samego początku łańcucha,
.*od którego możesz teraz zacząć lookahead (?<=(?=lookahead).*).
- Obsługuje łączenie i przecinanie klas postaci.
- Ma najbardziej rozbudowane wsparcie dla Unicode, z klasami znaków dla „skryptów, bloków, kategorii i właściwości binarnych Unicode” .
\Q...\E jak w Perlu / PCRE.
Rubin
W najnowszych wersjach ten smak jest podobnie potężny jak PCRE, w tym obsługa wywołań podprogramów. Podobnie jak Java, obsługuje także łączenie i przecinanie klas znaków. Jedną specjalną cechą jest wbudowana klasa znaków dla cyfr szesnastkowych: \h(i negowanych \H).
Najbardziej przydatną funkcją gry w golfa jest sposób, w jaki Ruby obsługuje kwantyfikatory. Przede wszystkim można zagnieżdżać kwantyfikatory bez nawiasów. .{5,7}+działa i tak działa .{3}?. Ponadto, w przeciwieństwie do większości innych smaków, jeśli dolną granicę kwantyfikatora 0można pominąć, np. .{,5}Jest równoważna .{0,5}.
Jeśli chodzi o podprogramy, główną różnicą między podprogramami PCRE i podprogramami Ruby jest to, że składnia Ruby jest dłuższa (?n)niż bajt \g<n>, ale podprogramy Ruby mogą być używane do przechwytywania, podczas gdy PCRE resetuje przechwytywanie po zakończeniu podprogramu.
Wreszcie, Ruby ma inną semantykę dla modyfikatorów związanych z linią niż większość innych smaków. Modyfikator, który jest zwykle wywoływany mw innych smakach, jest zawsze włączony w Ruby. Tak ^i $zawsze dopasować początek i koniec linii , nie tylko na początku i na końcu łańcucha. To może zaoszczędzić bajt, jeśli trzeba to zachowanie, ale będzie cię to kosztować dodatkowe bajty, jeśli tego nie zrobisz, bo będziesz musiał wymienić ^i $z \Ai \z, odpowiednio. Oprócz tego w Ruby jest wywoływany zwykle modyfikator s(który powoduje .dopasowanie linii) m. Nie wpływa to na liczbę bajtów, ale należy o tym pamiętać, aby uniknąć pomyłek.
Pyton
Python ma solidny smak, ale nie znam żadnych szczególnie użytecznych funkcji, których nigdzie indziej nie znajdziesz.
Jednakże , istnieje alternatywa smak , który jest przeznaczony do wymiany remodułu w pewnym momencie, a która zawiera wiele ciekawych funkcji. Oprócz dodania obsługi rekurencji, zmiennych długości znaków i operatorów kombinacji klas znaków, posiada także unikalną funkcję dopasowania rozmytego . Zasadniczo możesz określić liczbę dopuszczalnych błędów (wstawień, usunięć, podstawień), a silnik da ci przybliżone dopasowania.
ECMAScript
Smak ECMAScript jest bardzo ograniczony i dlatego rzadko przydatny do gry w golfa. Jedyną rzeczą, do której się zmierza, jest negowana pusta klasa postaci, [^] która pasuje do dowolnej postaci, a także bezwarunkowo nieudana klasa pustych postaci [](w przeciwieństwie do zwykłej (?!)). Niestety, smak nie ma żadnych cech, które sprawiają, że ten ostatni jest przydatny w przypadku normalnych problemów.
Lua
Lua ma swój własny, unikalny smak, który jest dość ograniczony (np. Nie można nawet kwantyfikować grup), ale ma kilka przydatnych i interesujących funkcji.
- Ma dużą liczbę skrótów dla wbudowanych klas znaków , w tym interpunkcję, wielkie / małe litery i cyfry szesnastkowe.
- Dzięki
%btemu obsługuje bardzo kompaktową składnię w celu dopasowania zbalansowanych ciągów. Np. %b()Dopasowuje a, (a następnie wszystko do pasującego )(poprawnie pomijając pary dopasowane wewnętrznie). (i )mogą tu być dowolne dwie postacie.
Podnieść
Smak regexowy wzmocnienia jest zasadniczo Perlem. Ma jednak kilka fajnych nowych funkcji zastępowania wyrażeń regularnych, w tym zmiany wielkości liter i warunki warunkowe . O ile mi wiadomo, ta ostatnia jest wyjątkowa dla Boost.