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
, \L
i \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...\E
aby 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 0
moż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 m
w 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 \A
i \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 re
moduł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
%b
temu 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.