Twoim zadaniem jest napisanie najkrótszego prawidłowego wyrażenia regularnego, którego żaden ciąg nie może dopasować, włączając pusty ciąg.
Zgłoszenia muszą mieć następujący formularz („notacja dosłowna”):
/pattern/optional-flags
Najkrótsze wyrażenie regularne wygrywa. Rozmiar wyrażenia regularnego jest liczony w znakach. (w tym ukośniki i flagi)
Wyjaśnij, jak działa wyrażenie regularne (jeśli nie jest trywialne)
Dzięki i baw się dobrze!
Odpowiedzi:
6 znaków
Na podstawie odpowiedzi primo i Petera Taylora oraz podpowiedzi od
man perlre
:/(?!)/
To wyrażenie regularne zgodne z perlem dopasowuje pusty ciąg, po którym nie następuje kolejny pusty ciąg.
źródło
/x\by/
, ale jeśli kiedykolwiek musiałbym użyć takiego wyrażenia regularnego - z jakiegokolwiek powodu - to odpowiedź jest również najczystsza)/(*FAIL)/
Prawdopodobnie primo's jest wyraźniejsze. (I faktycznieman perlre
to zdradził, wspominając, że moja faktycznie rozszerza się do jego wewnętrznie.)/(*FAIL)/
nie jest jednak tak przenośny. Nawet w Perlu myślę, że jest to bardziej niejasna funkcja niż negatywne spojrzenie w przyszłość.-Mre=debug
) mówi, że(?!)
jest zoptymalizowany(*FAIL)
przez optymalizator wyrażenia regularnego Perla (OPFAIL
zgodnie z-Mre=debug
). Poza tym nie sądzę, że widziałem(*FAIL)
poza Perlem 5 (i Perlem 6, jak się nazywa<!>
).8 znaków
Potrzebujemy łańcucha zawierającego znak, który jest jednocześnie
a
ib
oczywiście niemożliwy.źródło
/(?!x)x/
wygląda jeszcze bardziej niemożliwie ;-)5 znaków
W przeciwieństwie do wszystkich, którzy nadużywają
$
i^
... to faktycznie działa w Perlu:\A
dopasowuje początek łańcucha.źródło
^
.6 znaków
Na podstawie odpowiedzi Svena Hohensteina .
źródło
8 znaków
Granica słowa (
\b
) otoczona znakami „słowa” (\w
- jeden z[_a-zA-Z0-9]
). Nie można go dopasować, ponieważ jeden ze znaków poprzedzających granicę słowa lub następujących po niej musi być znakiem innym niż „słowo”.Nawiasem mówiąc: jest to podobne do niedopasowanego wyrażenia
gdzie
\W
oznacza znak inny niż „słowo”.źródło
/
liczą się kreski opakowaniowe . Zobacz na przykład wpis PO . Ale to świetny wpis!4 znaki
wyszukuje „a” po końcu ciągu.
lub
wyszukuje przed początkiem ciągu.
źródło
^
i$
w „nielegalnych” pozycjach tylko powoduje ich być traktowane jako zwykłe znaki. Twój pierwszy przykład pasuje do literału$a
wsed
i prawdopodobnie innych programów.echo 'a^b' | grep 'a^b'
kontraecho 'a^b' | grep -E 'a^b'
. Sprawdź 9.4.9 Zakotwiczanie wyrażeń ERE5 znaków
/$.^/
/$^/
dopasuje pusty ciąg, a wymaganie znaku pomiędzy nimi nie będzie.źródło
"$a^"
(lub cokolwiek w miejsce'a'
) w Perlu ( i być może sed ). Jednak wciąż miło!$.
jako bieżącą zmienną numeru wiersza. Który może być pusty, w którym to przypadku będzie/^/
.^
i$
'$^'
z grep, ale niestety pasował do łańcucha'$^'
. Smartass grep.9 znaków
Nie jestem pewien, ale
/[^\S\s]/
powinienem być nieporównywalny, ponieważ nie oznacza żadnej postaci, ale przynajmniej jedną z nich.źródło
+
.6 znaków
Myślę, że ten regex, który stworzyłem, zadziała:
Pasuje do granicy słowa (
\b
), która nie jest granicą słowa (\B
). Czym jest impos - czy naprawdę muszę ci to wyjaśniać?źródło
4 znaki
(Tylko smak ECMAScript)
W innych odmianach nie jest to poprawna klasa znaków (
]
byłaby uznana za znak w klasie, więc wyrażenie nie jest poprawne, ponieważ klasa nigdy nie jest zamknięta), ale standard ECMAScript akceptuje puste klasy znaków. Ponieważ jest to klasa, musi ona pasować do znaku (więc puste łańcuchy nie pasują), ale ponieważ nie zawiera pojedynczego znaku, żaden rzeczywisty znak również nie będzie pasował.źródło
/[]{0}/
. (Ps. Chociaż moja własna odpowiedź częściowo wygląda jak twoja, faktycznie czytam twoją po napisaniu mojej.)/[]/.test("")
. zwraca false. klasa znaków nigdy nie może dopasować pustego łańcucha, nawet jeśli nie zawiera znaków (wyobrażam sobie, że są one zaimplementowane tak, jakby „JEŚLI następny znak w łańcuchu jest jednym z wymienionych, dopasuj; ELSE nie powiedzie się”)./[]{0}/
jest legalny (w ECMAScript) i pasuje do pustego ciągu ... jednak nie jestem pewien, w jaki sposób ma to związek z moją odpowiedzią.6 znaków
Kwantyfikator dzierżawczy szuka jak największej liczby b, a następnie 1 więcej. 6 znaków, ale punkty za symetrię?
źródło
6 znaków
Nie jestem zwycięzcą, ale myślałem, że to dobra zabawa. grep i Python zarówno barf na tym, ale Perl wydaje się być w porządku.
Wydaje się być bardzo zależny od implementacji (co nie jest zaskakujące, biorąc pod uwagę jego dziwność). Bob informuje poniżej, że pasuje do wszystkiego w silniku wyrażeń regularnych JavaScript.
źródło
Może trochę oszukiwania, ale…
… Nie da się dopasować do wyrażenia regularnego POSIX praktycznie we wszystkich, jeśli nie we wszystkich implementacjach. PODSTAWOWE RE i ROZSZERZONE RE, nawet.
POSIX RE nie potrzebuje tych irytujących cięć i flag, które ma PCRE.
źródło
0
nie działa w języku PERL."0"=~0
jest prawdą ...\0
ITYM? Tak, większość implementacji perlre (1) i PCRE nie używa łańcuchów C, ale bufory o ograniczonych rozmiarach, w których ta sztuczka nie będzie działać, ale większość implementacji POSIX RE działa na łańcuchach C.5 znaków
Dopasowuje ciąg, który zaczyna się dowolnym znakiem przed rozpoczęciem łańcucha.
źródło
".^"
re.findall(r'^.^', '.^', re.DEBUG)
^
i.
są metaznakami, które nie są dosłowne, trzeba ich uciec4 znaki:
Działa z GNU grep 2.5.1 i egrep.
źródło
/.^/
= 4 znaki.//
? nie są one wymagane wszędzie ;-)/
Liczą się zawijające się ukośniki , patrz oryginalne pytanie („łącznie z ukośnikami i flagami”) oraz wpis PO .Perl 6 (5 znaków)
Trochę nadużywanie reguł (ponieważ wyrażenia regularne Perla 6 są różne i niezgodne ze standardowymi wyrażeniami regularnymi z założenia), ale mnie to nie obchodzi.
<!>
reguła informuje Perla 6, że wyrażenie regularne nie pasuje.źródło
6 bajtów
Skrót
(*FAIL)
, obsługiwany przez silniki regex kompatybilne z perl. Dzięki @HamZa za zwrócenie na to uwagi.9 bajtów
Powinien działać z każdym silnikiem wyrażenia regularnego, który w ogóle obsługuje czasowniki. Nie jestem przekonany, że tak naprawdę trzeba grać w golfa.
źródło
(*FAIL)
to czasownik, który zawsze zawodzi./(*F)/
:)4 znaki
Potrzebuje dowolnego znaku po zakończeniu łańcucha
źródło
$
jest wyjątkowy tylko na końcu wzoru.4 znaki z ukośnikami 2 bez
W silniku wyrażeń regularnych języka TXR pusta klasa
[]
znaków nie pasuje do żadnego znaku, a zatem nie ma łańcucha. Zachowuje się w ten sposób, ponieważ klasa znaków wymaga dopasowania znaku, a gdy jest pusta, oznacza, że żadna postać nie może go spełnić.Innym sposobem jest odwrócenie „zbiór wszystkich ciągów w tym pustym” regex
/.*/
przy użyciu operatora dopełniacza:/~.*/
. Uzupełnienie tego zestawu nie zawiera żadnych ciągów, a zatem nie może dopasować niczego.Wszystko to jest udokumentowane na stronie man:
Ukośniki nie są częścią składni wyrażenia regularnego per se; są tylko interpunkcją, która ogranicza wyrażenia regularne w notacji wyrażenia S. Świadek:
źródło
6 znaków
(lub 4, w zależności od tego, jak na to spojrzysz)
źródło
Jest to wyrażenie regularne o 5 znakach.
Pasuje do pustej grupy 1 lub więcej razy.
EDYTOWAĆ:
Usunąłem moją odpowiedź dla innych smaków:
Wszystko, co nie jest liczbą wewnątrz {}, pasuje do tekstu.
Ten będzie pasował do „. {- 1}”
źródło
5 znaków
Mam nadzieję, że to nie brzmi głupio:
/[]+/
źródło
Rzecz, która kończy się, zanim się zacznie ...
źródło
""
, to nie pasuje ciąg zawierający te dwa znaki dosłowne:"$^"
.