Regular Expressions
Przydatna prezentacja Regex
Szukaj…
Dopasuj datę
Należy pamiętać, że wyrażenie regularne zostało zaprojektowane w celu dopasowania daty (lub nie). Powiedzenie, że data jest ważna, jest znacznie bardziej skomplikowaną walką, ponieważ będzie wymagało dużo obsługi wyjątków (patrz warunki roku przestępnego ).
Zacznijmy od dopasowania miesiąca (1–12) z opcjonalnym początkowym 0:
0?[1-9]|1[0-2]
Aby dopasować dzień, również z opcjonalnym początkowym 0:
0?[1-9]|[12][0-9]|3[01]
I aby dopasować rok (załóżmy, że jest to zakres 1900 - 2999):
(?:19|20)[0-9]{2}
Separator może być spacją, myślnikiem, ukośnikiem, pustym itp. Możesz dodać wszystko, co Twoim zdaniem może być użyte jako separator:
[-\\/ ]?
Teraz połączysz całość i uzyskasz:
(0?[1-9]|1[0-2])[-\\/ ]?(0?[1-9]|[12][0-9]|3[01])[-/ ]?(?:19|20)[0-9]{2} // MMDDYYYY
(0?[1-9]|[12][0-9]|3[01])[-\\/ ]?(0?[1-9]|1[0-2])[-/ ]?(?:19|20)[0-9]{2} // DDMMYYYY
(?:19|20)[0-9]{2}[-\\/ ]?(0?[1-9]|1[0-2])[-/ ]?(0?[1-9]|[12][0-9]|3[01]) // YYYYMMDD
Jeśli chcesz być trochę bardziej pedantyczny, możesz użyć wstecznego odniesienia, aby mieć pewność, że dwa separatory będą takie same:
(0?[1-9]|1[0-2])([-\\/ ]?)(0?[1-9]|[12][0-9]|3[01])\2(?:19|20)[0-9]{2} // MMDDYYYY
^ refer to [-/ ]
(0?[1-9]|[12][0-9]|3[01])([-\\/ ]?)(0?[1-9]|1[0-2])\2(?:19|20)[0-9]{2} // DDMMYYYY
(?:19|20)[0-9]{2}([-\\/ ]?)(0?[1-9]|1[0-2])\2(0?[1-9]|[12][0-9]|3[01]) // YYYYMMDD
Dopasuj adres e-mail
Dopasowywanie adresu e-mail w ciągu znaków jest trudnym zadaniem, ponieważ specyfikacja RFC2822 , która go definiuje, jest złożona, co utrudnia wdrożenie go jako wyrażenie regularne. Aby uzyskać więcej informacji na temat tego, dlaczego nie warto dopasowywać wiadomości e-mail do wyrażenia regularnego, zapoznaj się z przykładem antypatternu, gdy nie należy używać wyrażenia regularnego: do dopasowywania wiadomości e-mail . Najlepszą radą, na którą należy zwrócić uwagę z tej strony, jest skorzystanie z recenzowanej i szeroko dostępnej biblioteki w swoim ulubionym języku, aby to zaimplementować.
Sprawdź poprawność formatu adresu e-mail
Gdy musisz szybko sprawdzić poprawność wpisu, aby upewnić się, że wygląda jak wiadomość e-mail, najlepszą opcją jest uproszczenie:
^\S{1,}@\S{2,}\.\S{2,}$
Wyrażenie regularne sprawdzi, czy adres e-mail jest ciągiem znaków oddzielonych spacjami o długości większej niż jeden, po którym następuje @
, po którym następują dwie sekwencje znaków spacji o długości dwóch lub więcej oddzielonych znakiem a .
. Nie jest doskonały i może sprawdzać poprawność nieprawidłowych adresów (zgodnie z formatem), ale co najważniejsze, nie unieważnia prawidłowych adresów.
Sprawdź, czy adres istnieje
Jedynym niezawodnym sposobem sprawdzenia poprawności wiadomości e-mail jest sprawdzenie jej istnienia. Kiedyś było przeznaczone do tego celu polecenie VRFY
SMTP, ale niestety, po nadużyciu przez spamerów nie jest już dostępne .
Zatem jedynym sposobem na sprawdzenie, czy poczta jest poprawna i istnieje, jest wysłanie wiadomości e-mail na ten adres.
Ogromne alternatywy Regex
Chociaż nie jest niemożliwe sprawdzenie poprawności adresu e-mail za pomocą wyrażenia regularnego. Jedyne problemy polegają na tym, że im bliższe specyfikacji będą te wyrażenia regularne, tym będą większe, w związku z czym są niemożliwie trudne do odczytania i utrzymania. Poniżej znajdziesz przykład tak dokładniejszych wyrażeń regularnych, które są używane w niektórych bibliotekach.
⚠️ Poniższe wyrażenia regularne podano dla celów dokumentacji i nauki, kopiowanie wklejania ich w kodzie jest złym pomysłem. Zamiast tego używaj tej biblioteki bezpośrednio, abyś mógł polegać na kodzie źródłowym i programistach równorzędnych, aby aktualizować i utrzymywać kod parsujący wiadomości e-mail.
Moduł dopasowania adresu Perla
Najlepszymi przykładami takiego wyrażenia regularnego są w niektórych językach standardowe biblioteki. Na przykład jest jeden z modułu RFC::RFC822::Address
w bibliotece Perla, który stara się być tak dokładny, jak to możliwe, zgodnie z RFC. Dla twojej ciekawości możesz znaleźć wersję tego wyrażenia regularnego pod tym adresem URL , który został wygenerowany z gramatyki, a jeśli masz ochotę skopiować, wklej go, oto cytat od autora wyrażenia regularnego:
„ Nie utrzymuję wyrażenia regularnego [link]. Mogą być w nim błędy, które zostały już naprawione w module Perla. ”
Moduł dopasowania adresu .Net
Innym, krótszym wariantem jest ten używany przez standardową bibliotekę .Net w module EmailAddressAttribute
:
^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?$
Ale nawet jeśli jest krótszy , wciąż jest zbyt duży, aby był czytelny i łatwy w utrzymaniu.
Moduł dopasowania adresu Ruby
W Ruby kompozycja wyrażeń regularnych jest używana w module rfc822 w celu dopasowania adresu. To fajny pomysł, ponieważ w przypadku znalezienia błędów łatwiej będzie wskazać część wyrażenia regularnego, aby ją zmienić i naprawić.
Moduł dopasowania adresu w języku Python
Jako przeciwny przykład moduł analizujący wiadomości e-mail w Pythonie nie używa wyrażenia regularnego, ale zamiast tego implementuje go za pomocą analizatora składni.
Dopasuj numer telefonu
Oto jak dopasować kod prefiksu (a +
lub (00), a następnie liczbę od 1 do 1939, z opcjonalnym odstępem):
To nie szuka poprawnego prefiksu, ale coś, co może być prefiksem. Zobacz pełną listę prefiksów
(?:00|\+)?[0-9]{4}
Następnie, ponieważ cała długość numeru telefonu wynosi maksymalnie 15, możemy wyszukać do 14 cyfr:
Co najmniej 1 cyfra jest wydana na prefiks
[0-9]{1,14}
Liczby mogą zawierać spacje, kropki lub myślniki i mogą być pogrupowane według 2 lub 3.
(?:[ .-][0-9]{3}){1,5}
Z opcjonalnym prefiksem:
(?:(?:00|\+)?[0-9]{4})?(?:[ .-][0-9]{3}){1,5}
Jeśli chcesz dopasować konkretny format kraju, możesz użyć tego zapytania wyszukiwania i dodać kraj, pytanie z pewnością zostało już zadane.
Dopasuj adres IP
IPv4
Aby dopasować format adresu IPv4, musisz sprawdzić numery [0-9]{1,3}
trzy razy {3}
oddzielone kropkami \.
i kończąc na innym numerze.
^(?:[0-9]{1,3}\.){3}[0-9]{1,3}$
To wyrażenie regularne jest zbyt proste - jeśli chcesz, aby było dokładne, musisz sprawdzić, czy liczby zawierają się w przedziale od 0
do 255
, a wyrażenie regularne powyżej akceptuje 444
w dowolnej pozycji. Chcesz sprawdzić 250-255 z 25[0-5]
lub dowolną inną wartością 200 2[0-4][0-9]
, lub dowolną wartością 100 lub mniejszą z [01]?[0-9][0-9]
. Chcesz sprawdzić, czy po nim następuje kropka \.
trzy razy {3}
a następnie raz bez kropki.
^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$
IPv6
Adresy IPv6 przybrać formę 8 16-bitowych słów oddzielonych sześciokątnych z dwukropek ( :
znaków). W takim przypadku sprawdzamy 7 słów, po których następują dwukropki, a następnie jedno, które nie jest. Jeśli słowo ma zera na początku, może zostać obcięte, co oznacza, że każde słowo może zawierać od 1 do 4 cyfr szesnastkowych.
^(?:[0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}$
To jednak jest niewystarczające. Ponieważ adresy IPv6 mogą stać się dość „niewygodne”, standard określa, że słowa tylko zero mogą być zastąpione przez ::
. Można to zrobić tylko raz w adresie (gdziekolwiek od 1 do 7 kolejnych słów), ponieważ w przeciwnym razie byłoby to nieokreślone. Powoduje to szereg (raczej nieprzyjemnych) odmian:
^::(?:[0-9a-fA-F]{1,4}:){0,6}[0-9a-fA-F]{1,4}$
^[0-9a-fA-F]{1,4}::(?:[0-9a-fA-F]{1,4}:){0,5}[0-9a-fA-F]{1,4}$
^[0-9a-fA-F]{1,4}:[0-9a-fA-F]{1,4}::(?:[0-9a-fA-F]{1,4}:){0,4}[0-9a-fA-F]{1,4}$
^(?:[0-9a-fA-F]{1,4}:){0,2}[0-9a-fA-F]{1,4}::(?:[0-9a-fA-F]{1,4}:){0,3}[0-9a-fA-F]{1,4}$
^(?:[0-9a-fA-F]{1,4}:){0,3}[0-9a-fA-F]{1,4}::(?:[0-9a-fA-F]{1,4}:){0,2}[0-9a-fA-F]{1,4}$
^(?:[0-9a-fA-F]{1,4}:){0,4}[0-9a-fA-F]{1,4}::(?:[0-9a-fA-F]{1,4}:)?[0-9a-fA-F]{1,4}$
^(?:[0-9a-fA-F]{1,4}:){0,5}[0-9a-fA-F]{1,4}::[0-9a-fA-F]{1,4}$
^(?:[0-9a-fA-F]{1,4}:){0,6}[0-9a-fA-F]{1,4}::$
Teraz, zebranie wszystkiego razem (przy użyciu przemienności) daje:
^(?:[0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}$|
^::(?:[0-9a-fA-F]{1,4}:){0,6}[0-9a-fA-F]{1,4}$|
^[0-9a-fA-F]{1,4}::(?:[0-9a-fA-F]{1,4}:){0,5}[0-9a-fA-F]{1,4}$|
^[0-9a-fA-F]{1,4}:[0-9a-fA-F]{1,4}::(?:[0-9a-fA-F]{1,4}:){0,4}[0-9a-fA-F]{1,4}$|
^(?:[0-9a-fA-F]{1,4}:){0,2}[0-9a-fA-F]{1,4}::(?:[0-9a-fA-F]{1,4}:){0,3}[0-9a-fA-F]{1,4}$|
^(?:[0-9a-fA-F]{1,4}:){0,3}[0-9a-fA-F]{1,4}::(?:[0-9a-fA-F]{1,4}:){0,2}[0-9a-fA-F]{1,4}$|
^(?:[0-9a-fA-F]{1,4}:){0,4}[0-9a-fA-F]{1,4}::(?:[0-9a-fA-F]{1,4}:)?[0-9a-fA-F]{1,4}$|
^(?:[0-9a-fA-F]{1,4}:){0,5}[0-9a-fA-F]{1,4}::[0-9a-fA-F]{1,4}$|
^(?:[0-9a-fA-F]{1,4}:){0,6}[0-9a-fA-F]{1,4}::$
Pamiętaj, aby napisać to w trybie wielowierszowym i ze stosem komentarzy, aby ktokolwiek miał nieuchronnie zadanie dowiedzieć się, co to znaczy, nie przyjdzie po tępym obiekcie.
Sprawdź poprawność ciągu 12 godzin i 24 godzin
W formacie 12-godzinnym można użyć:
^(?:0?[0-9]|1[0-2])[-:][0-5][0-9]\s*[ap]m$
Gdzie
-
(?:0?[0-9]|1[0-2])
to godzina -
[-:]
to separator, który można dostosować do własnych potrzeb -
[0-5][0-9]
to minuta -
\s*[ap]m
podąża za dowolną liczbą białych znaków orazam
lubpm
Jeśli potrzebujesz sekund:
^(?:0?[0-9]|1[0-2])[-:][0-5][0-9][-:][0-5][0-9]\s*[ap]m$
W przypadku formatu 24-godzinnego:
^(?:[01][0-9]|2[0-3])[-:h][0-5][0-9]$
Gdzie:
-
(?:[01][0-9]|2[0-3])
to godzina -
[-:h]
separator, który można dostosować do własnych potrzeb -
[0-5][0-9]
to minuta
Z sekundami:
^(?:[01][0-9]|2[0-3])[-:h][0-5][0-9][-:m][0-5][0-9]$
Gdzie [-:m]
jest drugim separatorem, zamieniając h
na godziny na m
na minuty, a [0-5][0-9]
jest drugim.
Dopasuj kod pocztowy w Wielkiej Brytanii
Regex, aby dopasować kody pocztowe w Wielkiej Brytanii
Format jest następujący, gdzie A oznacza literę, a 9 cyfrę:
Format | Pokrycie | Przykład |
---|---|---|
Komórka | Komórka | |
AA9A 9AA | Obszar kodu pocztowego WC; EC1 – EC4, NW1W, SE1P, SW1 | EC1A 1BB |
A9A 9AA | E1W, N1C, N1P | W1A 0AX |
A9 9AA, A99 9AA | B, E, G, L, M, N, S, W | M1 1AE, B33 8TH |
AA9 9AA, AA99 9AA | Wszystkie inne kody pocztowe | CR2 6XH, DN55 1PT |
(GIR 0AA)|((([A-Z-[QVX]][0-9][0-9]?)|(([A-Z-[QVX]][A-Z-[IJZ]][0-9][0-9]?)|(([A-Z-[QVX]][0-9][A-HJKPSTUW])|([A-Z-[QVX]][A-Z-[IJZ]][0-9][ABEHMNPRVWXY])))) [0-9][A-Z-[CIKMOV]]{2})
Gdzie pierwsza część:
(GIR 0AA)|((([A-Z-[QVX]][0-9][0-9]?)|(([A-Z-[QVX]][A-Z-[IJZ]][0-9][0-9]?)|(([A-Z-[QVX]][0-9][A-HJKPSTUW])|([A-Z-[QVX]][A-Z-[IJZ]][0-9][ABEHMNPRVWXY]))))
Druga:
[0-9][A-Z-[CIKMOV]]{2})