Jestem po wyrażeniu regularnym, które zweryfikuje pełny złożony kod pocztowy w Wielkiej Brytanii tylko w ciągu wejściowym. Wszystkie nietypowe formularze kodów pocztowych muszą być objęte, tak jak zwykle. Na przykład:
mecze
- CW3 9SS
- SE5 0EG
- SE50EG
- se5 0eg
- WC2H 7LT
Nie pasuje
- aWC2H 7LT
- WC2H 7LTa
- WC2H
Jak rozwiązać ten problem?
regex
validation
regex-group
postal-code
Kieran Benton
źródło
źródło
Odpowiedzi:
Polecam zapoznać się z brytyjskim standardem danych rządowych dla kodów pocztowych [link już nie żyje; archiwum XML , dyskusja w Wikipedii ]. Istnieje krótki opis danych, a dołączony schemat xml zawiera wyrażenie regularne. To może nie być dokładnie to, czego chcesz, ale byłby dobrym punktem wyjścia. RegEx różni się nieco od XML, ponieważ znak P na trzeciej pozycji w formacie A9A 9AA jest dozwolony przez podaną definicję.
RegEx dostarczone przez rząd Wielkiej Brytanii to:
Jak wskazano w dyskusji na Wikipedii, pozwoli to na użycie niektórych nierzeczywistych kodów pocztowych (np. Zaczynających AA, ZY) i zapewni bardziej rygorystyczny test, który możesz wypróbować.
źródło
^([Gg][Ii][Rr] 0[Aa]{2})|((([A-Za-z][0-9]{1,2})|(([A-Za-z][A-Ha-hJ-Yj-y][0-9]{1,2})|(([AZa-z][0-9][A-Za-z])|([A-Za-z][A-Ha-hJ-Yj-y][0-9]?[A-Za-z]))))[0-9][A-Za-z]{2})$
Wygląda na to, że będziemy używać
^(GIR ?0AA|[A-PR-UWYZ]([0-9]{1,2}|([A-HK-Y][0-9]([0-9ABEHMNPRV-Y])?)|[0-9][A-HJKPS-UW]) ?[0-9][ABD-HJLNP-UW-Z]{2})$
, czyli nieco zmodyfikowanej wersji sugestii Minglis powyżej.Będziemy jednak musieli dokładnie zbadać, jakie są reguły, ponieważ wydaje się, że różne rozwiązania wymienione powyżej stosują różne reguły dotyczące dozwolonych liter.
Po kilku badaniach znaleźliśmy więcej informacji. Wygląda na to, że strona „govtalk.gov.uk” wskazuje ci kod pocztowy govtalk-postcode . Wskazuje to na schemat XML w schemacie XML, który zawiera instrukcję „pseudo regex” reguł kodu pocztowego.
Podjęliśmy to i pracowaliśmy nad tym, aby dać nam następujące wyrażenie:
To sprawia, że spacje są opcjonalne, ale ogranicza Cię do jednego spacji (zamień „&” na „{0,} dla nieograniczonej liczby spacji). Zakłada, że cały tekst musi być pisany wielkimi literami.
Jeśli chcesz zezwolić na małe litery, z dowolną liczbą spacji, użyj:
Nie obejmuje to terytoriów zamorskich i wymusza jedynie format, a NIE istnienie różnych obszarów. Opiera się na następujących zasadach:
Może akceptować następujące formaty:
Gdzie:
Wszystkiego najlepszego
Colin
źródło
^(([gG][iI][rR] {0,}0[aA]{2})|(([aA][sS][cC][nN]|[sS][tT][hH][lL]|[tT][dD][cC][uU]|[bB][bB][nN][dD]|[bB][iI][qQ][qQ]|[fF][iI][qQ][qQ]|[pP][cC][rR][nN]|[sS][iI][qQ][qQ]|[iT][kK][cC][aA]) {0,}1[zZ]{2})|((([a-pr-uwyzA-PR-UWYZ][a-hk-yxA-HK-XY]?[0-9][0-9]?)|(([a-pr-uwyzA-PR-UWYZ][0-9][a-hjkstuwA-HJKSTUW])|([a-pr-uwyzA-PR-UWYZ][a-hk-yA-HK-Y][0-9][abehmnprv-yABEHMNPRV-Y]))) {0,}[0-9][abd-hjlnp-uw-zABD-HJLNP-UW-Z]{2}))$
{0,}
zamiast*
nieograniczonej liczby opcjonalnych miejsc?Niedawno pisał odpowiedź na to pytanie na temat kodów pocztowych Wielkiej Brytanii na języku R . Odkryłem, że wzorzec wyrażenia regularnego rządu brytyjskiego jest nieprawidłowy i nie działa prawidłowo zweryfikować niektóre kody pocztowe. Niestety wiele odpowiedzi tutaj opiera się na tym niepoprawnym wzorze.
Poniżej opiszę niektóre z tych problemów i przedstawię poprawione wyrażenie regularne, które faktycznie działa.
Uwaga
Moja odpowiedź (i ogólnie wyrażenia regularne):
Jeśli nie zależy ci na złym wyrażeniu regularnym i po prostu chcesz przejść do odpowiedzi, przewiń w dół do odpowiedzi sekcji .
The Bad Regex
Nie należy używać wyrażeń regularnych w tej sekcji.
Jest to błąd polegający na tym, że rząd Wielkiej Brytanii dostarczył programistom (nie jestem pewien, jak długo będzie działał ten link, ale można to zobaczyć w dokumentacji Bulk Data Transfer ):
Problemy
Problem 1 - Kopiuj / Wklej
Zobacz regex w użyciu tutaj .
Jak zapewne wielu programistów, kopiuje / wkleja kod (szczególnie wyrażenia regularne) i wkleja, oczekując, że zadziałają. Chociaż jest to świetne w teorii, nie udaje się w tym konkretnym przypadku, ponieważ kopiowanie / wklejanie z tego dokumentu faktycznie zmienia jeden ze znaków (spację) na znak nowej linii, jak pokazano poniżej:
Pierwszą rzeczą, którą zrobią większość programistów, jest po prostu usunięcie nowej linii bez zastanowienia się. Teraz wyrażenie regularne nie będzie pasowało do kodów pocztowych ze spacjami w nich (innymi niż
GIR 0AA
kod pocztowy).Aby rozwiązać ten problem, znak nowej linii należy zastąpić znakiem spacji:
Problem 2 - Granice
Zobacz regex w użyciu tutaj .
Wyrażenie kodu pocztowego nieprawidłowo zakotwicza wyrażenie regularne. Każdy, kto używa tego wyrażenia regularnego do sprawdzania kodów pocztowych, może być zaskoczony, jeśli wartość taka jak
fooA11 1AA
. Jest tak, ponieważ zakotwiczili początek pierwszej opcji i koniec drugiej opcji (niezależnie od siebie), jak wskazano w wyrażeniu regularnym powyżej.Oznacza to, że
^
(zapewnia pozycję na początku wiersza) działa tylko w pierwszej opcji([Gg][Ii][Rr] 0[Aa]{2})
, więc druga opcja zweryfikuje wszystkie ciągi, które się kończą się kodem pocztowym (niezależnie od tego, co nastąpi wcześniej).Podobnie pierwsza opcja nie jest zakotwiczona na końcu linii
$
, więcGIR 0AAfoo
jest również akceptowana.Aby rozwiązać ten problem, obie opcje należy zapakować w inną grupę (lub grupę nieprzechwycącą), a kotwice umieścić wokół tego:
Problem 3 - Niewłaściwy zestaw znaków
Zobacz regex w użyciu tutaj .
Wyrażenie regularne brakuje
-
tutaj, aby wskazać zakres znaków. W obecnej postaci, jeśli kod pocztowy ma formatANA NAA
(gdzieA
reprezentuje literę iN
cyfrę) i zaczyna się od czegoś innego niżA
lubZ
, nie powiedzie się.Oznacza to, że będzie on pasował
A1A 1AA
iZ1A 1AA
, ale nieB1A 1AA
.Aby rozwiązać ten problem, znak
-
należy umieścić międzyA
orazZ
w odpowiednim zestawie znaków:Problem 4 - Niepoprawny opcjonalny zestaw znaków
Zobacz regex w użyciu tutaj .
Przysięgam, że nawet nie przetestowali tego przed opublikowaniem go w Internecie. Zrobili opcjonalny niewłaściwy zestaw znaków. Dokonali
[0-9]
opcji w czwartym podwariacie opcji 2 (grupa 9). Dzięki temu wyrażenie regularne dopasowuje niepoprawnie sformatowane kody pocztowe, takie jakAAA 1AA
.Aby rozwiązać ten problem, ustaw opcjonalną następną klasę znaków (a następnie
[0-9]
dopasuj zestaw dokładnie raz):Problem 5 - Wydajność
Wydajność tego wyrażenia regularnego jest bardzo niska. Po pierwsze, umieścili najmniej prawdopodobną opcję dopasowania
GIR 0AA
na początku. Ilu użytkowników prawdopodobnie będzie miało ten kod pocztowy w porównaniu do dowolnego innego kodu pocztowego; prawdopodobnie nigdy? Oznacza to, że przy każdym użyciu wyrażenia regularnego musi on wyczerpać tę opcję przed przejściem do następnej opcji. Aby zobaczyć, jak wpływa to na wydajność, sprawdź liczbę kroków, które wykonał pierwotny regex (35) w stosunku do tego samego regex po odwróceniu opcji (22).Drugi problem z wydajnością wynika ze struktury całego wyrażenia regularnego. Nie ma sensu cofanie się po każdej opcji, jeśli jedna zawiedzie. Strukturę obecnego wyrażenia regularnego można znacznie uprościć. Podaję poprawkę w sekcji Odpowiedź .
Problem 6 - Przestrzenie
Zobacz regex w użyciu tutaj
Nie może to być uważane za problem , ale budzi zaniepokojenie większości programistów. Spacje w wyrażeniu regularnym nie są opcjonalne, co oznacza, że użytkownicy wprowadzający swoje kody pocztowe muszą umieścić spację w kodzie pocztowym. Jest to łatwa poprawka, po prostu dodając
?
spacje, aby uczynić je opcjonalnymi. Aby uzyskać poprawkę, zobacz sekcję Odpowiedź .Odpowiedź
1. Ustalenie Regeksu rządu Wielkiej Brytanii
Naprawienie wszystkich problemów opisanych w sekcji Problemy i uproszczenie wzoru daje następujący, krótszy i bardziej zwięzły wzór. Możemy również usunąć większość grup, ponieważ weryfikujemy kod pocztowy jako całość (nie poszczególne części):
Zobacz regex w użyciu tutaj
Można to dodatkowo skrócić, usuwając wszystkie zakresy z jednego ze znaków (wielkie lub małe) i używając flagi bez rozróżniania wielkości liter. Uwaga : niektóre języki nie mają takiego, więc użyj dłuższego z powyższych. Każdy język implementuje flagę rozróżniania wielkości liter inaczej.
Zobacz regex w użyciu tutaj .
Krótszy ponownie wymianie
[0-9]
z\d
(jeśli silnik regex je obsługuje):Zobacz regex w użyciu tutaj .
2. Uproszczone wzory
Bez konieczności podawania określonych znaków alfabetycznych można użyć następujących (pamiętaj o uproszczeniach z 1. Ustalono również tutaj Regex Rządu Zjednoczonego Królestwa ):
Zobacz regex w użyciu tutaj .
Co więcej, jeśli nie zależy ci na specjalnym przypadku
GIR 0AA
:3. Skomplikowane wzory
Nie sugeruję nadmiernej weryfikacji kodu pocztowego, ponieważ nowe Obszary, Dzielnice i Podrejgi mogą pojawić się w dowolnym momencie. To, co zasugeruję potencjalnie do zrobienia, to dodane wsparcie dla przypadków skrajnych. Istnieją specjalne przypadki, które opisano w tym artykule w Wikipedii .
Oto złożone wyrażenia regularne, które zawierają podrozdziały 3. (3.1, 3.2, 3.3).
W odniesieniu do wzorców w 1. Naprawianie Regeksu rządu Wielkiej Brytanii :
Zobacz regex w użyciu tutaj
I w związku z 2. Uproszczonymi wzorami :
Zobacz regex w użyciu tutaj
3.1 Brytyjskie terytoria zamorskie
Artykuł w Wikipedii stwierdza obecnie (niektóre formaty nieco uproszczone):
AI-1111
: AnguilaASCN 1ZZ
: Wyspa WniebowstąpieniaSTHL 1ZZ
: Święta HelenaTDCU 1ZZ
: Tristan da CunhaBBND 1ZZ
: Brytyjskie Terytorium Oceanu IndyjskiegoBIQQ 1ZZ
: Brytyjskie Terytorium AntarktyczneFIQQ 1ZZ
: FalklandyGX11 1ZZ
: GibraltarPCRN 1ZZ
: Wyspy PitcairnSIQQ 1ZZ
: Georgia Południowa i Sandwich PołudniowyTKCA 1ZZ
: Wyspy Turks i CaicosBFPO 11
: Akrotiri i DhekeliaZZ 11
IGE CX
: Bermudy (zgodnie z tym dokumentem )KY1-1111
: Kajmany (zgodnie z tym dokumentem )VG1111
: Brytyjskie Wyspy Dziewicze (zgodnie z tym dokumentem )MSR 1111
: Montserrat (zgodnie z tym dokumentem )Kompleksowy regex pasujący tylko do brytyjskich terytoriów zamorskich może wyglądać następująco:
Zobacz regex w użyciu tutaj .
3.2 Urząd pocztowy sił brytyjskich
Chociaż zostały ostatnio zmienione, aby lepiej dostosować się do brytyjskiego systemu kodów pocztowych do
BF#
(gdzie#
reprezentuje liczbę), są uważane za opcjonalne alternatywne kody pocztowe . Te kody pocztowe mają (ed) formatBFPO
, a następnie 1-4 cyfry:Zobacz regex w użyciu tutaj
3.3 Święty Mikołaj?
Mikołaj ma inny szczególny przypadek (jak wspomniano w innych odpowiedziach):
SAN TA1
jest to prawidłowy kod pocztowy. Wyrażenie regularne tego jest bardzo proste:źródło
Nie ma czegoś takiego jak kompleksowe wyrażenie regularne kodów pocztowych w Wielkiej Brytanii, które jest w stanie zweryfikować kod pocztowy. Możesz sprawdzić, czy kod pocztowy ma poprawny format, używając wyrażenia regularnego; nie że tak naprawdę istnieje.
Kody pocztowe są dowolnie złożone i ciągle się zmieniają. Na przykład kod pocztowy
W1
nie ma i może nigdy nie mieć wszystkich liczb od 1 do 99 dla każdego obszaru kodu pocztowego.Nie możesz oczekiwać, że to, co obecnie istnieje, będzie wieczne. Na przykład w 1990 r. Urząd pocztowy zdecydował, że Aberdeen robi się trochę zatłoczony. Dodali 0 na końcu AB1-5, co czyni go AB10-50, a następnie utworzyli między nimi kilka kodów pocztowych.
Za każdym razem, gdy tworzona jest nowa ulica, tworzony jest nowy kod pocztowy. Jest to część procesu uzyskiwania pozwolenia na budowę; lokalne władze są zobowiązane do aktualizowania tego na poczcie (nie że wszyscy to robią).
Ponadto, jak zauważyło wielu innych użytkowników, istnieją specjalne kody pocztowe, takie jak Girobank, GIR 0AA, i ten do listów do Świętego Mikołaja, SAN TA1 - prawdopodobnie nie chcesz nic tam publikować, ale wydaje się, że nie być objęty jakąkolwiek inną odpowiedzią.
Potem są kody pocztowe BFPO, które teraz zmieniają się na bardziej standardowy format . Oba formaty będą ważne. Na koniec jest Wikipedia Wikipedia z zagranicy .
Następnie należy wziąć pod uwagę, że Wielka Brytania „wyeksportowała” swój system kodów pocztowych do wielu miejsc na świecie. Wszystko, co potwierdzi kod pocztowy „UK”, również potwierdzi kody pocztowe wielu innych krajów.
Jeśli chcesz sprawdzić poprawność brytyjskiego kodu pocztowego, najbezpieczniejszym sposobem jest sprawdzenie aktualnego kodu pocztowego. Istnieje wiele opcji:
Ordnance Survey publikuje Code-Point Open na podstawie licencji na otwarte dane. Będzie trochę za późno, ale za darmo. Nie spowoduje to (prawdopodobnie - nie pamiętam) danych z Irlandii Północnej, ponieważ badanie Ordnance Survey nie ma tam żadnych uprawnień. Mapowanie w Irlandii Północnej jest przeprowadzane przez Ordnance Survey z Irlandii Północnej i mają one swój oddzielny, opłacony produkt Pointer . Możesz użyć tego i dołączyć kilka, które nie są dość łatwo objęte.
Royal Mail wydaje plik z kodem pocztowym (PAF) , w tym BFPO, co nie jestem pewien, że Code-Point Open to robi. Jest aktualizowany regularnie, ale kosztuje pieniądze (i czasami mogą być wredni). PAF zawiera pełny adres, a nie tylko kody pocztowe, oraz własny Przewodnik dla programistów . Grupa Użytkowników Otwartych Danych (ODUG) obecnie lobbuje za darmowym wydaniem PAF, oto opis ich pozycji .
Wreszcie istnieje Baza adresów . Jest to współpraca między Ordnance Survey, władzami lokalnymi, Royal Mail i firmą zajmującą się dopasowywaniem w celu stworzenia ostatecznego katalogu wszystkich informacji o wszystkich adresach w Wielkiej Brytanii (również były dość udane). Jest płatny, ale jeśli współpracujesz z władzami lokalnymi, departamentem rządowym lub służbą rządową, korzystanie z nich jest bezpłatne. Zawiera o wiele więcej informacji niż tylko kody pocztowe.
źródło
Przyjrzałem się niektórym z powyższych odpowiedzi i odradzam stosowanie wzorca z odpowiedzi @ Dana (ok. 15 grudnia 2010 r.) , Ponieważ nieprawidłowo oznacza prawie 0,4% prawidłowych kodów pocztowych jako nieprawidłowe, podczas gdy inne nie .
Ordnance Survey zapewnia usługę o nazwie Code Point Open, która:
Uruchomiłem każdy z powyższych wyrażeń regularnych z pełną listą kodów pocztowych (6 lipca 13) z tych danych, używając
grep
:Łącznie jest 1668 202 kodów pocztowych.
Poniżej podano liczby prawidłowych kodów pocztowych, które nie pasują do siebie
$pattern
:Oczywiście wyniki te dotyczą tylko prawidłowych kodów pocztowych, które zostały nieprawidłowo oznaczone jako nieprawidłowe. Więc:
Nie mówię nic o tym, który wzorzec jest najlepszy w zakresie odfiltrowywania nieprawidłowych kodów pocztowych.
źródło
http://regexlib.com/REDetails.aspx?regexp_id=260
źródło
0-9
, czego nie możeszWedług tej tabeli w Wikipedii
Ten wzór obejmuje wszystkie przypadki
Używając go na Androidzie \ Java użyj \\ d
źródło
Większość odpowiedzi tutaj nie działała dla wszystkich kodów pocztowych, które mam w swojej bazie danych. W końcu znalazłem taki, który sprawdza się u wszystkich, korzystając z nowego wyrażenia regularnego dostarczonego przez rząd:
https://www.gov.uk/government/uploads/system/uploads/attachment_data/file/413338/Bulk_Data_Transfer_-_additional_validation_valid_from_March_2015.pdf
Nie ma go w żadnej z poprzednich odpowiedzi, więc zamieszczam go tutaj na wypadek, gdyby usunęli link:
AKTUALIZACJA: Zaktualizowano wyrażenie regularne, jak wskazał Jamie Bull. Nie jestem pewien, czy to był mój błąd podczas kopiowania, czy błąd w wyrażeniu regularnym rządu, link jest teraz wyłączony ...
AKTUALIZACJA: Jak znaleziono ctwheels, ten regex działa ze smakiem regex javascript. Zobacz jego komentarz do tego, który działa ze smakiem pcre (php).
źródło
^([Gg][Ii][Rr] 0[Aa]{2})|((([A-Za-z][0-9]{1,2})|(([A-Za-z][A-Ha-hJ-Yj-y][0-9]{1,2})|(([AZa-z][0-9][A-Za-z])|([A-Za-z][A-Ha-hJ-Yj-y][0-9]?[A-Za-z])))) [0-9][A-Za-z]{2})$
powinno być^([Gg][Ii][Rr] 0[Aa]{2})|((([A-Za-z][0-9]{1,2})|(([A-Za-z][A-Ha-hJ-Yj-y][0-9]{1,2})|(([A-Za-z][0-9][A-Za-z])|([A-Za-z][A-Ha-hJ-Yj-y][0-9]?[A-Za-z])))) [0-9][A-Za-z]{2})$
- zauważ różnicę ;-)([Gg][Ii][Rr] 0[Aa]{2})|((([A-Za-z][0-9]{1,2})|(([A-Za-z][A-Ha-hJ-Yj-y][0-9]{1,2})|(([A-Za-z][0-9][A-Za-z])|([A-Za-z][A-Ha-hJ-Yj-y][0-9]?[A-Za-z])))) ?[0-9][A-Za-z]{2})
(usunąłem^
i$
dodałem?
spację) dla regexr.com, aby znaleźć więcej niż jeden wynik i dla obu, aby znaleźć wynik, który nie ma separatora przestrzeni.(?:)
a następnie umieścić wokół niego kotwice. Zobacz, jak zawodzi tutaj . Aby uzyskać więcej informacji, zobacz moją odpowiedź tutaj .^(?:([Gg][Ii][Rr] 0[Aa]{2})|((([A-Za-z][0-9]{1,2})|(([A-Za-z][A-Ha-hJ-Yj-y][0-9]{1,2})|(([A-Za-z][0-9][A-Za-z])|([A-Za-z][A-Ha-hJ-Yj-y][0-9]?[A-Za-z])))) [0-9][A-Za-z]{2}))$
jest poprawionym wyrażeniem regularnym.Stary post, ale wciąż dość wysoki w wynikach Google, więc pomyślałem, że zaktualizuję. Ten dokument z 14 października definiuje wyrażenie regularne kodu pocztowego w Wielkiej Brytanii jako:
z:
https://www.gov.uk/government/uploads/system/uploads/attachment_data/file/359448/4__Bulk_Data_Transfer_-_additional_validation_valid.pdf
Dokument wyjaśnia również logikę tego procesu. Ma jednak błąd (pogrubiony), a także pozwala na pisanie małymi literami, co, choć nie jest normalne, jest zmienioną wersją:
Działa to z nowymi londyńskimi kodami pocztowymi (np. W1D 5LH), których nie miały poprzednie wersje.
źródło
(?:)
a następnie umieścić wokół niego kotwice. Zobacz, jak zawodzi tutaj . Aby uzyskać więcej informacji, zobacz moją odpowiedź tutaj .^(?:([Gg][Ii][Rr] 0[Aa]{2})|((([A-Za-z][0-9]{1,2})|(([A-Za-z][A-Ha-hJ-Yj-y][0-9]{1,2})|(([A-Za-z][0-9][A-Za-z])|([A-Za-z][A-Ha-hJ-Yj-y][0-9]?[A-Za-z])))) [0-9][A-Za-z]{2}))$
jest poprawionym wyrażeniem regularnym.Oto regex, który Google obsługuje w swojej domenie i18napis.appspot.com :
źródło
Kody pocztowe mogą ulec zmianie, a jedynym prawdziwym sposobem sprawdzania poprawności kodu pocztowego jest posiadanie pełnej listy kodów pocztowych i sprawdzenie, czy istnieje.
Ale wyrażenia regularne są przydatne, ponieważ:
Ale wyrażenia regularne są trudne do utrzymania, szczególnie dla kogoś, kto nie wymyślił tego w pierwszej kolejności. Więc musi to być:
Oznacza to, że większość wyrażeń regularnych w tej odpowiedzi nie jest wystarczająco dobra. Np. Widzę to
[A-PR-UWYZ][A-HK-Y][0-9][ABEHMNPRV-Y]
będzie pasować do obszaru kodu pocztowego w postaci AA1A - ale będzie to ból w szyi, jeśli i kiedy zostanie dodany nowy obszar kodu pocztowego, ponieważ trudno jest zrozumieć, które obszary kodu pocztowego pasują.Chcę również, aby moje wyrażenie regularne dopasowywało pierwszą i drugą połowę kodu pocztowego jako dopasowania w nawiasach.
Więc wpadłem na to:
W formacie PCRE można go zapisać w następujący sposób:
Dla mnie jest to odpowiednia równowaga między walidacją w jak największym stopniu, przy jednoczesnym zabezpieczeniu na przyszłość i umożliwieniu łatwej konserwacji.
źródło
aSW1A 1AAasfg
Dopasowane do mnie (nie głosowałem jednak, ponieważ wydaje się, że można to łatwo naprawić)Szukałem regexu kodu pocztowego w Wielkiej Brytanii przez ostatni dzień i natknąłem się na ten wątek. Przeszedłem przez większość powyższych sugestii i żadna z nich nie działała dla mnie, więc wymyśliłem swój regex, który, o ile wiem, przechowuje wszystkie ważne kody pocztowe w Wielkiej Brytanii od stycznia 2013 r. (Według najnowszej literatury z Royal Mail).
Wyrażenie regularne i niektóre proste sprawdzanie kodu PHP znajduje się poniżej. UWAGA: - Pozwala na pisanie małymi lub dużymi kodami pocztowymi oraz anomalię GIR 0AA, ale aby poradzić sobie z bardziej niż prawdopodobną obecnością spacji w środku wprowadzonego kodu pocztowego, wykorzystuje również prosty str_replace do usunięcia spacji przed testowaniem przeciw wyrażeniu regularnemu. Wszelkie rozbieżności poza tym i sama Royal Mail nawet nie wspominają o nich w swojej literaturze (patrz http://www.royalmail.com/sites/default/files/docs/pdf/programmers_guide_edition_7_v5.pdf i zacznij czytać od strony 17) !
Uwaga: we własnej literaturze Royal Mail (link powyżej) istnieje niewielka dwuznaczność wokół 3. i 4. pozycji oraz wyjątków, jeśli te znaki są literami. Skontaktowałem się bezpośrednio z Royal Mail, aby to wyjaśnić i ich własnymi słowami: „List na czwartej pozycji kodu zewnętrznego w formacie AANA NAA nie ma wyjątków, a wyjątki na trzeciej pozycji dotyczą tylko ostatniej litery kodu zewnętrznego z format ANA NAA. ” Prosto z pyska konia!
Mam nadzieję, że pomoże to każdemu, kto spotyka ten wątek, szukając rozwiązania.
źródło
SW1A
LubBD25
bez drugiej połowy (lub przynajmniej tak zrobiłem dla mnie)Oto regex oparty na formacie określonym w dokumentach powiązanych z odpowiedzią marcj:
Jedyną różnicą między tym a specyfikacją jest to, że 2 ostatnie znaki nie mogą być w [CIKMOV] zgodnie ze specyfikacją.
Edycja: Oto kolejna wersja, która sprawdza ograniczenia znaków końcowych.
źródło
A-Z
-Q
nigdy nie jest dozwolony,V
jest używany tylko oszczędnie itp., W zależności od położenia znaku.Niektóre z powyższych wyrażeń regularnych są nieco restrykcyjne. Zwróć uwagę, że prawdziwy kod pocztowy: „W1K 7AA” nie powiedzie się, biorąc pod uwagę regułę „Pozycja 3 - AEHMNPRTVXY użyto tylko” powyżej, ponieważ „K” zostanie niedozwolone.
regex:
Wydaje się nieco dokładniejszy, zobacz artykuł w Wikipedii zatytułowany „Kody pocztowe w Wielkiej Brytanii” .
Zauważ, że regex wymaga tylko wielkich liter.
Większe pytanie dotyczy tego, czy ograniczasz wprowadzanie danych przez użytkownika, aby zezwalać tylko na istniejące kody pocztowe, czy też próbujesz po prostu powstrzymać użytkowników przed wprowadzaniem kompletnych śmieci do pól formularza. Prawidłowe dopasowanie każdego możliwego kodu pocztowego i sprawdzenie go w przyszłości jest trudniejszą łamigłówką i prawdopodobnie nie jest tego warte, chyba że jesteś HMRC.
źródło
oto jak radziliśmy sobie z problemem brytyjskiego kodu pocztowego:
Wyjaśnienie:
Otrzymuje większość formatów, następnie używamy db, aby sprawdzić, czy kod pocztowy jest rzeczywiście prawdziwy, dane te są sterowane przez openpoint https://www.ordnancesurvey.co.uk/opendatadownload/products.html
mam nadzieję że to pomoże
źródło
AANNA NAA
to na nieprawidłowy format .Podstawowe zasady:
Kody pocztowe w Wielkiej Brytanii (lub kody pocztowe, jak się je nazywa) składają się z pięciu do siedmiu znaków alfanumerycznych oddzielonych spacją. Zasady określające, które postacie mogą pojawiać się na poszczególnych pozycjach, są dość skomplikowane i pełne wyjątków. Dlatego właśnie pokazane wyrażenie regularne przestrzega podstawowych zasad.
Kompletne zasady:
Jeśli potrzebujesz wyrażenia regularnego, które zaznacza wszystkie pola reguł kodu pocztowego kosztem czytelności, proszę:
Źródło: https://www.safaribooksonline.com/library/view/regular-expressions-cookbook/9781449327453/ch04s16.html
Testowane na bazie danych naszych klientów i wydaje się być całkowicie dokładne.
źródło
Korzystam z następującego wyrażenia regularnego, które przetestowałem na wszystkich prawidłowych kodach pocztowych w Wielkiej Brytanii. Opiera się na zalecanych regułach, ale jest maksymalnie skondensowany i nie korzysta ze specjalnych reguł wyrażeń regularnych specyficznych dla języka.
Zakłada się, że kod pocztowy został przekonwertowany na wielkie litery i nie ma znaków wiodących ani końcowych, ale zaakceptuje opcjonalną spację między kodem zewnętrznym a kodem incode.
Specjalny kod pocztowy „GIR0 0AA” jest wykluczony i nie będzie sprawdzany, ponieważ nie znajduje się na oficjalnej liście kodów pocztowych i, o ile wiem, nie będzie używany jako zarejestrowany adres. Dodanie go powinno być trywialne jako specjalny przypadek, jeśli jest to wymagane.
źródło
Chciałem prostego wyrażenia regularnego, w którym można pozwolić na zbyt wiele, ale nie odmawiać prawidłowego kodu pocztowego. Poszedłem z tym (wejście jest ciągiem okrojonym / przyciętym):
Umożliwia to stosowanie możliwie najkrótszych kodów pocztowych, takich jak „L1 8JQ”, a także najdłuższych, takich jak „OL14 5ET”.
Ponieważ pozwala na maksymalnie 8 znaków, pozwoli również na niepoprawne 8-znakowe kody pocztowe, jeśli nie będzie spacji: „OL145ETX”. Ale znowu, jest to proste wyrażenie, gdy jest to wystarczająco dobre.
źródło
Pierwsza połowa prawidłowego formatu kodu pocztowego
Wyjątki
Pozycja 1 - QVX nieużywany
Pozycja 2 - IJZ nieużywany z wyjątkiem GIR 0AA
Pozycja 3 - AEHMNPRTVXY tylko używany
Pozycja 4 - ABEHMNPRVWXY
Druga połowa kodu pocztowego
Wyjątki
Pozycja 2 + 3 - CIKMOV nieużywany
Pamiętaj, że nie są używane wszystkie możliwe kody, więc ta lista jest koniecznym, ale niewystarczającym warunkiem prawidłowego kodu. Może łatwiej jest po prostu dopasować listę wszystkich ważnych kodów?
źródło
Aby sprawdzić, czy kod pocztowy ma prawidłowy format, zgodnie z podręcznikiem programisty Royal Mail :
Wszystkie kody pocztowe na doogal.co.uk są zgodne, z wyjątkiem tych, które nie są już używane.
Dodanie
?
spacji i użycie dopasowania bez rozróżniania wielkości liter, aby odpowiedzieć na to pytanie:źródło
Ta zezwala na puste spacje i tabulatory z obu stron na wypadek, gdyby nie chcesz nie sprawdzać poprawności, a następnie przyciąć ją oddzielić.
źródło
AAA 1AA
Nie jest prawidłowym formatem: zobacz moją odpowiedź, aby uzyskać wyjaśnienie i poprawkę.Aby dodać do tej listy bardziej praktyczne wyrażenie, którego używam, które pozwala użytkownikowi wprowadzić
empty string
:Ten regex pozwala na pisanie wielkimi i małymi literami z opcjonalną spacją pomiędzy nimi
Z punktu widzenia twórców oprogramowania ta regex jest przydatna w przypadku oprogramowania, w którym adres może być opcjonalny. Na przykład, jeśli użytkownik nie chce podać swoich danych adresowych
źródło
Spójrz na kod python na tej stronie:
http://www.brunningonline.net/simon/blog/archives/001292.html
Użyłem go do przetwarzania kodów pocztowych.
źródło
Otrzymaliśmy specyfikację:
Wymyśliliśmy to:
Ale uwaga - pozwala to na dowolną liczbę spacji między grupami.
źródło
Mam regex do sprawdzania poprawności kodów pocztowych w Wielkiej Brytanii.
Działa to dla wszystkich typów kodów pocztowych wewnętrznych lub zewnętrznych
Działa to dla wszystkich typów formatów.
Przykład:
źródło
Przyjęta odpowiedź odzwierciedla zasady podane przez Royal Mail, chociaż w wyrażeniu regularnym występuje literówka. Wydaje się, że ta literówka była tam również na stronie gov.uk (tak jak na stronie archiwum XML).
W formacie A9A 9AA reguły zezwalają znakowi P na trzeciej pozycji, a wyrażenie regularne tego nie zezwala. Poprawnym wyrażeniem regularnym byłoby:
Skrócenie tego powoduje wyrażenie regularne (które używa składni Perl / Ruby):
Zawiera także opcjonalną spację między pierwszym a drugim blokiem.
źródło
To, co znalazłem w prawie wszystkich odmianach i wyrażeniu regularnym z pliku PDF przesyłania zbiorczego, i to, co znajduje się na stronie wikipedia, jest takie, szczególnie dla wyrażenia regularnego wikipedia, po pierwszym | (pionowym pasku) musi być ^. Zrozumiałem to, testując dla AA9A 9AA, ponieważ w przeciwnym razie sprawdzenie formatu dla A9A 9AA to potwierdzi. Na przykład sprawdzenie EC1D 1BB, które powinno być nieprawidłowe, powraca jako ważne, ponieważ C1D 1BB jest prawidłowym formatem.
Oto, co wymyśliłem dla dobrego wyrażenia regularnego:
źródło
Dzięki testom empirycznym i obserwacji, a także potwierdzeniu za pomocą https://en.wikipedia.org/wiki/Postcodes_in_the_United_Kingdom#Validation , oto moja wersja wyrażenia regularnego Python, który poprawnie analizuje i weryfikuje brytyjski kod pocztowy:
UK_POSTCODE_REGEX = r'(?P<postcode_area>[A-Z]{1,2})(?P<district>(?:[0-9]{1,2})|(?:[0-9][A-Z]))(?P<sector>[0-9])(?P<postcode>[A-Z]{2})'
Ten wyrażenie regularne jest proste i zawiera grupy przechwytywania. Nie obejmuje ona wszystkich sprawdzeń poprawności legalnych kodów pocztowych w Wielkiej Brytanii, ale uwzględnia jedynie pozycje literowe vs. liczbowe.
Oto jak użyłbym tego w kodzie:
Oto testy jednostkowe:
źródło
Potrzebowałem wersji, która działałaby w SAS z
PRXMATCH
powiązanymi funkcjami, więc wymyśliłem:Przypadki testowe i uwagi:
źródło
Poniższa metoda sprawdzi kod pocztowy i dostarczy pełne informacje
źródło