Jaki jest ostateczny kod pocztowy i wyrażenie regularne?


200

Szukam najlepszego kodu pocztowego i wyrażenia regularnego. Szukam czegoś, co obejmie większość (miejmy nadzieję) całego świata.


4
Jeden regex dla wszystkich kodów pocztowych byłby bezużyteczny w większości przypadków, nie mówiąc już o wymaganiu dużej ilości kodowania Unicode. Znacznie lepiej jest sprawdzić wyrażenia regularne dla poszczególnych krajów, aby nie sprawdzać poprawności takich rzeczy jak „Nowy Jork, NY AF23Q”.
Tak - ten Jake.

101
Masz problem. Napisz do niej wyrażenie regularne. Teraz masz dwa problemy.
Robert S.

regexlib.com/Search.aspx?k=decimal&c=3&m=-1&ps=100 w celu sprawdzenia poprawności pola, przejdź tutaj
Dinesh Kumar

2
Ten, który obsługuje wszystkie możliwe przyszłe wartości.
Jodrell,

Odpowiedzi:


126

Nie ma żadnego.

Kody pocztowe / pocztowe na całym świecie nie mają wspólnego wzoru. W niektórych krajach składają się z cyfr, w innych mogą być kombinacjami cyfr i liter, niektóre mogą zawierać spacje, inne kropki, liczba znaków może wynosić od dwóch do co najmniej sześciu ...

To, co możesz zrobić (teoretycznie), to utworzenie osobnego wyrażenia regularnego dla każdego kraju na świecie, co nie jest godne polecenia IMO. Ale nadal nie byłoby cię w części dotyczącej sprawdzania poprawności: kod pocztowy 12345może istnieć, ale 12346nie, może 12344też nie istnieje. Jak to sprawdzić za pomocą wyrażenia regularnego?

Nie możesz


Podejrzewam, że można by skompilować wyrażenie regularne, ale takie zadanie może być lepiej dostosowane do bazy danych. Wyrażenie regularne wyglądałoby mniej więcej tak: 10000 | 10001 | 10002 | 10003 | .......
Kibbee


Możesz najpierw użyć
wyrażenia regularnego

3
Moje dwa centy: w Brazylii to w rzeczywistości 8 liczb, 5, po których następuje myślnik i 3 więcej
Jorge Campos

^\d{5}(?:[-\s]\d{4})?$
Aamir Afridi

260

Unicode CLDR zawiera regex kodu pocztowego dla każdego kraju. (W sumie 158 wyrażeń regularnych!)

Google ma również usługę internetową z informacjami o formatowaniu adresów dla poszczególnych krajów, w tym kodami pocztowymi, tutaj - http://i18napis.appspot.com/address (znalazłem ten link za pośrednictwem http://unicode.org/review/pri180/ )

Edytować

Tutaj kopia wyrażenia regularnego postalCodeData.xml :

"GB", "GIR[ ]?0AA|((AB|AL|B|BA|BB|BD|BH|BL|BN|BR|BS|BT|CA|CB|CF|CH|CM|CO|CR|CT|CV|CW|DA|DD|DE|DG|DH|DL|DN|DT|DY|E|EC|EH|EN|EX|FK|FY|G|GL|GY|GU|HA|HD|HG|HP|HR|HS|HU|HX|IG|IM|IP|IV|JE|KA|KT|KW|KY|L|LA|LD|LE|LL|LN|LS|LU|M|ME|MK|ML|N|NE|NG|NN|NP|NR|NW|OL|OX|PA|PE|PH|PL|PO|PR|RG|RH|RM|S|SA|SE|SG|SK|SL|SM|SN|SO|SP|SR|SS|ST|SW|SY|TA|TD|TF|TN|TQ|TR|TS|TW|UB|W|WA|WC|WD|WF|WN|WR|WS|WV|YO|ZE)(\d[\dA-Z]?[ ]?\d[ABD-HJLN-UW-Z]{2}))|BFPO[ ]?\d{1,4}"
"JE", "JE\d[\dA-Z]?[ ]?\d[ABD-HJLN-UW-Z]{2}"
"GG", "GY\d[\dA-Z]?[ ]?\d[ABD-HJLN-UW-Z]{2}"
"IM", "IM\d[\dA-Z]?[ ]?\d[ABD-HJLN-UW-Z]{2}"
"US", "\d{5}([ \-]\d{4})?"
"CA", "[ABCEGHJKLMNPRSTVXY]\d[ABCEGHJ-NPRSTV-Z][ ]?\d[ABCEGHJ-NPRSTV-Z]\d"
"DE", "\d{5}"
"JP", "\d{3}-\d{4}"
"FR", "\d{2}[ ]?\d{3}"
"AU", "\d{4}"
"IT", "\d{5}"
"CH", "\d{4}"
"AT", "\d{4}"
"ES", "\d{5}"
"NL", "\d{4}[ ]?[A-Z]{2}"
"BE", "\d{4}"
"DK", "\d{4}"
"SE", "\d{3}[ ]?\d{2}"
"NO", "\d{4}"
"BR", "\d{5}[\-]?\d{3}"
"PT", "\d{4}([\-]\d{3})?"
"FI", "\d{5}"
"AX", "22\d{3}"
"KR", "\d{3}[\-]\d{3}"
"CN", "\d{6}"
"TW", "\d{3}(\d{2})?"
"SG", "\d{6}"
"DZ", "\d{5}"
"AD", "AD\d{3}"
"AR", "([A-HJ-NP-Z])?\d{4}([A-Z]{3})?"
"AM", "(37)?\d{4}"
"AZ", "\d{4}"
"BH", "((1[0-2]|[2-9])\d{2})?"
"BD", "\d{4}"
"BB", "(BB\d{5})?"
"BY", "\d{6}"
"BM", "[A-Z]{2}[ ]?[A-Z0-9]{2}"
"BA", "\d{5}"
"IO", "BBND 1ZZ"
"BN", "[A-Z]{2}[ ]?\d{4}"
"BG", "\d{4}"
"KH", "\d{5}"
"CV", "\d{4}"
"CL", "\d{7}"
"CR", "\d{4,5}|\d{3}-\d{4}"
"HR", "\d{5}"
"CY", "\d{4}"
"CZ", "\d{3}[ ]?\d{2}"
"DO", "\d{5}"
"EC", "([A-Z]\d{4}[A-Z]|(?:[A-Z]{2})?\d{6})?"
"EG", "\d{5}"
"EE", "\d{5}"
"FO", "\d{3}"
"GE", "\d{4}"
"GR", "\d{3}[ ]?\d{2}"
"GL", "39\d{2}"
"GT", "\d{5}"
"HT", "\d{4}"
"HN", "(?:\d{5})?"
"HU", "\d{4}"
"IS", "\d{3}"
"IN", "\d{6}"
"ID", "\d{5}"
"IL", "\d{5}"
"JO", "\d{5}"
"KZ", "\d{6}"
"KE", "\d{5}"
"KW", "\d{5}"
"LA", "\d{5}"
"LV", "\d{4}"
"LB", "(\d{4}([ ]?\d{4})?)?"
"LI", "(948[5-9])|(949[0-7])"
"LT", "\d{5}"
"LU", "\d{4}"
"MK", "\d{4}"
"MY", "\d{5}"
"MV", "\d{5}"
"MT", "[A-Z]{3}[ ]?\d{2,4}"
"MU", "(\d{3}[A-Z]{2}\d{3})?"
"MX", "\d{5}"
"MD", "\d{4}"
"MC", "980\d{2}"
"MA", "\d{5}"
"NP", "\d{5}"
"NZ", "\d{4}"
"NI", "((\d{4}-)?\d{3}-\d{3}(-\d{1})?)?"
"NG", "(\d{6})?"
"OM", "(PC )?\d{3}"
"PK", "\d{5}"
"PY", "\d{4}"
"PH", "\d{4}"
"PL", "\d{2}-\d{3}"
"PR", "00[679]\d{2}([ \-]\d{4})?"
"RO", "\d{6}"
"RU", "\d{6}"
"SM", "4789\d"
"SA", "\d{5}"
"SN", "\d{5}"
"SK", "\d{3}[ ]?\d{2}"
"SI", "\d{4}"
"ZA", "\d{4}"
"LK", "\d{5}"
"TJ", "\d{6}"
"TH", "\d{5}"
"TN", "\d{4}"
"TR", "\d{5}"
"TM", "\d{6}"
"UA", "\d{5}"
"UY", "\d{5}"
"UZ", "\d{6}"
"VA", "00120"
"VE", "\d{4}"
"ZM", "\d{5}"
"AS", "96799"
"CC", "6799"
"CK", "\d{4}"
"RS", "\d{6}"
"ME", "8\d{4}"
"CS", "\d{5}"
"YU", "\d{5}"
"CX", "6798"
"ET", "\d{4}"
"FK", "FIQQ 1ZZ"
"NF", "2899"
"FM", "(9694[1-4])([ \-]\d{4})?"
"GF", "9[78]3\d{2}"
"GN", "\d{3}"
"GP", "9[78][01]\d{2}"
"GS", "SIQQ 1ZZ"
"GU", "969[123]\d([ \-]\d{4})?"
"GW", "\d{4}"
"HM", "\d{4}"
"IQ", "\d{5}"
"KG", "\d{6}"
"LR", "\d{4}"
"LS", "\d{3}"
"MG", "\d{3}"
"MH", "969[67]\d([ \-]\d{4})?"
"MN", "\d{6}"
"MP", "9695[012]([ \-]\d{4})?"
"MQ", "9[78]2\d{2}"
"NC", "988\d{2}"
"NE", "\d{4}"
"VI", "008(([0-4]\d)|(5[01]))([ \-]\d{4})?"
"PF", "987\d{2}"
"PG", "\d{3}"
"PM", "9[78]5\d{2}"
"PN", "PCRN 1ZZ"
"PW", "96940"
"RE", "9[78]4\d{2}"
"SH", "(ASCN|STHL) 1ZZ"
"SJ", "\d{4}"
"SO", "\d{5}"
"SZ", "[HLMS]\d{3}"
"TC", "TKCA 1ZZ"
"WF", "986\d{2}"
"XK", "\d{5}"
"YT", "976\d{2}"

3
Po krótkim skanowaniu wyrażenia regularnego AU ... to wyrażenie jest bardzo proste i pozwoli na uzyskanie wielu fałszywych trafień, więc nie jest wyczerpujące.
Taryn East

7
Najnowsza wersja CLDR unicode zawierająca regex kodu pocztowego to wersja 26.0.1. W późniejszych wersjach został on usunięty, ponieważ dane nie były utrzymywane i nie można było znaleźć innych wiarygodnych źródeł.
Oprogramowanie KIKO

1
To samo, bardzo podstawowe dla francuskiego wyrażenia regularnego. Użyj tego "^ ((0 [1-9]) | ([1-8] [0-9]) | (9 [0-8]) | (2A) | (2B)) [0-9] {3} $ "-> developpez.net/forums/d518232/webmasters-developpement-web/…
Vincent D.

Używam i18napis.appspot.com/address/data/GB teraz; czy są jakieś problemy z tą usługą?
mgol

1
Mała poprawka do komentarza @ kiko-software: najnowsza wersja zawierająca dane kodu pocztowego to 27.0.3 .
Sietse

89

użyj tych regx

$ZIPREG=array(
    "US"=>"^\d{5}([\-]?\d{4})?$",
    "UK"=>"^(GIR|[A-Z]\d[A-Z\d]??|[A-Z]{2}\d[A-Z\d]??)[ ]??(\d[A-Z]{2})$",
    "DE"=>"\b((?:0[1-46-9]\d{3})|(?:[1-357-9]\d{4})|(?:[4][0-24-9]\d{3})|(?:[6][013-9]\d{3}))\b",
    "CA"=>"^([ABCEGHJKLMNPRSTVXY]\d[ABCEGHJKLMNPRSTVWXYZ])\ {0,1}(\d[ABCEGHJKLMNPRSTVWXYZ]\d)$",
    "FR"=>"^(F-)?((2[A|B])|[0-9]{2})[0-9]{3}$",
    "IT"=>"^(V-|I-)?[0-9]{5}$",
    "AU"=>"^(0[289][0-9]{2})|([1345689][0-9]{3})|(2[0-8][0-9]{2})|(290[0-9])|(291[0-4])|(7[0-4][0-9]{2})|(7[8-9][0-9]{2})$",
    "NL"=>"^[1-9][0-9]{3}\s?([a-zA-Z]{2})?$",
    "ES"=>"^([1-9]{2}|[0-9][1-9]|[1-9][0-9])[0-9]{3}$",
    "DK"=>"^([D|d][K|k]( |-))?[1-9]{1}[0-9]{3}$",
    "SE"=>"^(s-|S-){0,1}[0-9]{3}\s?[0-9]{2}$",
    "BE"=>"^[1-9]{1}[0-9]{3}$",
    "IN"=>"^\d{6}$"
);

7
Jedna z lepszych prób, jakie widziałem, by odpowiedzieć na OP. Działaj wolniej, gdy reklamujesz więcej, ale czyste i jasne podejście.
Rob

3
Nie zwalnia, gdy dodajesz więcej, jak sugeruje Rob, tak jakbyś wybrał jeden z wyrażeń regularnych z kodu kraju.
Thomaschaaf

2
Widzę, że opublikowałeś to w 2012 roku. Masz więcej?
rybo111

@ rybo111 sprawdź odpowiedź Chi.
Giulio Caccin

5
@ ddunn801, istnieje ogromna różnica między sprawdzaniem poprawności wzoru a uwierzytelnianiem kodu pocztowego. Uwierzytelnianie kodów jest trudniejsze o całe rzędy wielkości, ponieważ (przynajmniej w USA) kody pocztowe są dodawane i upuszczane regularnie. W idealnym świecie dokonałbyś szybkiej kontroli w celu sprawdzenia poprawności wzoru przed przesłaniem go do usługi (np. USPS) w celu potwierdzenia całego adresu pocztowego (usługi takie jak te są płatne, nie chciałbyś marnować wartości na złe dane ). Niestety świat jest daleki od ideału.
JBH

48
  1. Każdy system kodów pocztowych używa tylko AZ i / lub 0-9, a czasem spacji / myślnika

  2. Nie każdy kraj używa kodów pocztowych (np. Irlandia poza Dublinem), ale tutaj to zignorujemy.

  3. Najkrótszym formatem kodu pocztowego jest Sierra Leone NN

  4. Najdłuższe jest Samoa Amerykańskie NNNNN-NNNNNN

  5. Powinieneś pozwolić na jedną spację lub myślnik.

  6. Nie powinien zaczynać się ani kończyć spacją lub myślnikiem

Powinno to obejmować powyższe:

(?i)^[a-z0-9][a-z0-9\- ]{0,10}[a-z0-9]$

8
To wydaje się być jedyną odpowiedzią, która zapewnia kontrolę poczytalności (prawdopodobnie tego właśnie chciał PO), a nie pełną weryfikację każdej możliwej kombinacji. Dokładnie to, czego chciałem
Lukos

1
@ GiulioCaccin H0H0H0 jest prawidłowym kanadyjskim kodem pocztowym (którego dzieci używają do otrzymywania listów z Canada Post udając Świętego Mikołaja), ale to nie znaczy, że jest to prawidłowy kod pocztowy klienta :)
Neil McGuigan

2
Do Twojej wiadomości, Samoa Amerykańskie jest na tyle małe, że ma tylko jeden kod pocztowy i ma
numer

5
Moim zdaniem jest to jedyna dobra odpowiedź. Można go na przykład uniwersalnie wykorzystać jako wstępną weryfikację w atrybucie wzorca HTML.
Blackbam,

1
Myślę, że jest to dobra odpowiedź na sytuację, w której chce się jedynie przeprowadzić kontrolę zdrowia psychicznego i nie weryfikować dokładnie według kraju. Wystarczy mieć trochę czystsze dane bez większego wysiłku - w przypadkach, gdy potrzebne jest pełne bezpieczeństwo, wtyczka / usługa innej firmy może być potrzebna, jak zauważyli inni.
Yo Ludke,

17

Próba objęcia całego świata jednym wyrażeniem regularnym nie jest całkowicie możliwa, a na pewno nie jest możliwa ani zalecana.

Nie trącić własnym rogiem, ale napisałem całkiem dokładne wyrażenia regularne, które mogą ci się przydać.

  • Kanadyjskie kody pocztowe

    Basic validation:
    ^[ABCEGHJ-NPRSTVXY]{1}[0-9]{1}[ABCEGHJ-NPRSTV-Z]{1}[ ]?[0-9]{1}[ABCEGHJ-NPRSTV-Z]{1}[0-9]{1}$
    
    Extended validation:
    ^(A(0[ABCEGHJ-NPR]|1[ABCEGHK-NSV-Y]|2[ABHNV]|5[A]|8[A])|B(0[CEHJ-NPRSTVW]|1[ABCEGHJ-NPRSTV-Y]|2[ABCEGHJNRSTV-Z]|3[ABEGHJ-NPRSTVZ]|4[ABCEGHNPRV]|5[A]|6[L]|9[A])|C(0[AB]|1[ABCEN])|E(1[ABCEGHJNVWX]|2[AEGHJ-NPRSV]|3[ABCELNVYZ]|4[ABCEGHJ-NPRSTV-Z]|5[ABCEGHJ-NPRSTV]|6[ABCEGHJKL]|7[ABCEGHJ-NP]|8[ABCEGJ-NPRST]|9[ABCEGH])|G(0[ACEGHJ-NPRSTV-Z]|1[ABCEGHJ-NPRSTV-Y]|2[ABCEGJ-N]|3[ABCEGHJ-NZ]|4[ARSTVWXZ]|5[ABCHJLMNRTVXYZ]|6[ABCEGHJKLPRSTVWXZ]|7[ABGHJKNPSTXYZ]|8[ABCEGHJ-NPTVWYZ]|9[ABCHNPRTX])|H(0[HM]|1[ABCEGHJ-NPRSTV-Z]|2[ABCEGHJ-NPRSTV-Z]|3[ABCEGHJ-NPRSTV-Z]|4[ABCEGHJ-NPRSTV-Z]|5[AB]|7[ABCEGHJ-NPRSTV-Y]|8[NPRSTYZ]|9[ABCEGHJKPRSWX])|J(0[ABCEGHJ-NPRSTV-Z]|1[ACEGHJ-NRSTXZ]|2[ABCEGHJ-NRSTWXY]|3[ABEGHLMNPRTVXYZ]|4[BGHJ-NPRSTV-Z]|5[ABCJ-MRTV-Z]|6[AEJKNRSTVWYXZ]|7[ABCEGHJ-NPRTV-Z]|8[ABCEGHLMNPRTVXYZ]|9[ABEHJLNTVXYZ])|K(0[ABCEGHJ-M]|1[ABCEGHJ-NPRSTV-Z]|2[ABCEGHJ-MPRSTVW]|4[ABCKMPR]|6[AHJKTV]|7[ACGHK-NPRSV]|8[ABHNPRV]|9[AHJKLV])|L(0[[ABCEGHJ-NPRS]]|1[ABCEGHJ-NPRSTV-Z]|2[AEGHJMNPRSTVW]|3[BCKMPRSTVXYZ]|4[ABCEGHJ-NPRSTV-Z]|5[ABCEGHJ-NPRSTVW]|6[ABCEGHJ-MPRSTV-Z]|7[ABCEGJ-NPRST]|8[EGHJ-NPRSTVW]|9[ABCGHK-NPRSTVWYZ])|M(1[BCEGHJ-NPRSTVWX]|2[HJ-NPR]|3[ABCHJ-N]|4[ABCEGHJ-NPRSTV-Y]|5[ABCEGHJ-NPRSTVWX]|6[ABCEGHJ-NPRS]|7[AY]|8[V-Z]|9[ABCLMNPRVW])|N(0[ABCEGHJ-NPR]|1[ACEGHKLMPRST]|2[ABCEGHJ-NPRTVZ]|3[ABCEHLPRSTVWY]|4[BGKLNSTVWXZ]|5[ACHLPRV-Z]|6[ABCEGHJ-NP]|7[AGLMSTVWX]|8[AHMNPRSTV-Y]|9[ABCEGHJKVY])|P(0[ABCEGHJ-NPRSTV-Y]|1[ABCHLP]|2[ABN]|3[ABCEGLNPY]|4[NPR]|5[AEN]|6[ABC]|7[ABCEGJKL]|8[NT]|9[AN])|R(0[ABCEGHJ-M]|1[ABN]|2[CEGHJ-NPRV-Y]|3[ABCEGHJ-NPRSTV-Y]|4[AHJKL]|5[AGH]|6[MW]|7[ABCN]|8[AN]|9[A])|S(0[ACEGHJ-NP]|2[V]|3[N]|4[AHLNPRSTV-Z]|6[HJKVWX]|7[HJ-NPRSTVW]|9[AHVX])|T(0[ABCEGHJ-MPV]|1[ABCGHJ-MPRSV-Y]|2[ABCEGHJ-NPRSTV-Z]|3[ABCEGHJ-NPRZ]|4[ABCEGHJLNPRSTVX]|5[ABCEGHJ-NPRSTV-Z]|6[ABCEGHJ-NPRSTVWX]|7[AENPSVXYZ]|8[ABCEGHLNRSVWX]|9[ACEGHJKMNSVWX])|V(0[ABCEGHJ-NPRSTVWX]|1[ABCEGHJ-NPRSTV-Z]|2[ABCEGHJ-NPRSTV-Z]|3[ABCEGHJ-NRSTV-Y]|4[ABCEGK-NPRSTVWXZ]|5[ABCEGHJ-NPRSTV-Z]|6[ABCEGHJ-NPRSTV-Z]|7[ABCEGHJ-NPRSTV-Y]|8[ABCGJ-NPRSTV-Z]|9[ABCEGHJ-NPRSTV-Z])|X(0[ABCGX]|1[A])|Y(0[AB]|1[A]))[ ]?[0-9]{1}[ABCEGHJ-NPRSTV-Z]{1}[0-9]{1}$
  • Amerykańskie kody pocztowe

    ^[0-9]{5}(-[0-9]{4})?$
  • Kody pocztowe w Wielkiej Brytanii

    ^([A-PR-UWYZ]([0-9]{1,2}|([A-HK-Y][0-9]|[A-HK-Y][0-9]([0-9]|[ABEHMNPRV-Y]))|[0-9][A-HJKS-UW])\ [0-9][ABD-HJLNP-UW-Z]{2}|(GIR\ 0AA)|(SAN\ TA1)|(BFPO\ (C\/O\ )?[0-9]{1,4})|((ASCN|BBND|[BFS]IQQ|PCRN|STHL|TDCU|TKCA)\ 1ZZ))$

Nie można zagwarantować dokładności bez faktycznego wysłania czegoś na adres i bez powiadomienia osoby, gdy ją otrzyma, ale możemy zawęzić sytuację, eliminując przypadki, o których wiemy, że są złe.


W rozszerzonej wersji kanadyjskich kodów pocztowych może być coś nie tak lub jej brak, ponieważ mówi, że następujący kod pocztowy jest nieprawidłowy: E3G 0A1, chociaż jest prawidłowy.
fsschmitt,

Sprawdziłem poprawność w stosunku do wszystkich 845 495 kodów pocztowych w Kanadzie i ten ciąg wyrażeń regularnych zawiera pewne poprawki w rozszerzonej walidacji w celu obsługi wszystkich tych kodów pocztowych. Oto nowy ciąg
wyrażeń

14

To wygląda na dobrą referencję, chociaż nie ma jej w Regex.

Naprawdę, chyba że faktycznie wysyłasz coś do swoich użytkowników, nie sądzę, żeby było warto. A jeśli je wysyłasz, możesz skorzystać z narzędzi / usług do czyszczenia adresów, aby ułatwić sobie życie.


Ponadto, nawet jeśli jest to dzisiaj prawidłowy kod pocztowy, bardzo dobrze może się zmienić w przyszłości. USPS stale dodaje nowe i dzieli obszary. Jedynym sposobem, aby nadążyć, jest sprawdzenie w momencie faktycznej wysyłki. Niektóre miasta decydują się nawet na zmianę własnego kodu pocztowego z różnych powodów.
NotMe

Wygląda na to, że ktoś wziął powyższy artykuł na wiki i przesłał go do JSON z regexem
Chris Smith

8

Używamy:

Kanada

([A-Z]{1}[0-9]{1}){3}   //We raise to upper first

Ameryka

[0-9]{5}                //-or-
[0-9]{5}-[0-9]{4}       //10 digit zip

Inny

Zaakceptuj jak jest


1
Sugeruję dodanie opcjonalnego - [0-9] {4} do amerykańskiego. Niektóre osoby używają ZIP + 4.
David Thornley

4
/ [0-9] {5} (?: - [0-9] {4})? / Pozwala zweryfikować oba style jednocześnie ze Stanów Zjednoczonych.
Chas. Owens

2
@ Chas.Owens dodając ^ i $ upewnia się, że nie mogą pisać nic więcej przed ani po, np. „12345aaa” ... / ^ [0-9] {5} (?: - [0-9] {4}) ? $ /
Tim Franklin

7

W zależności od aplikacji możesz zaimplementować dopasowanie wyrażeń regularnych dla krajów, z których pochodzi większość odwiedzających, i nie sprawdzać poprawności dla pozostałych (akceptuj cokolwiek).


6
.* 

Big Jump zapomniał o łamaniu linii, odstępach i znakach kontrolnych.

Międzynarodowe kody pocztowe są rodzajem problemu zatrzymania.


6

Należy pamiętać, że jest to dość trudny problem, zgodnie z przyjętą odpowiedzią. Ale chyba nie zniechęciło to ludzi z geonames.org . Mają plik z informacją o kraju , który nie mieści się w całości w tej odpowiedzi - najwyraźniej limit wynosi 30000 znaków. Istnieją wyrażenia regularne dla około 150 krajów.

Wyodrębniłem tutaj fragmenty związane z tym pytaniem:

AD ^(?:AD)*(\d{3})$
AM ^(\d{6})$
AR ^([A-Z]\d{4}[A-Z]{3})$
AT ^(\d{4})$
AU ^(\d{4})$
AX ^(?:FI)*(\d{5})$
AZ ^(?:AZ)*(\d{4})$
BA ^(\d{5})$
BB ^(?:BB)*(\d{5})$
BD ^(\d{4})$
BE ^(\d{4})$
BG ^(\d{4})$
BH ^(\d{3}\d?)$
BM ^([A-Z]{2}\d{2})$
BN ^([A-Z]{2}\d{4})$
BR ^(\d{8})$
BY ^(\d{6})$
CA ^([ABCEGHJKLMNPRSTVXY]\d[ABCEGHJKLMNPRSTVWXYZ]) ?(\d[ABCEGHJKLMNPRSTVWXYZ]\d)$
CH ^(\d{4})$
CL ^(\d{7})$
CN ^(\d{6})$
CR ^(\d{4})$
CU ^(?:CP)*(\d{5})$
CV ^(\d{4})$
CX ^(\d{4})$
CY ^(\d{4})$
CZ ^(\d{5})$
DE ^(\d{5})$
DK ^(\d{4})$
DO ^(\d{5})$
DZ ^(\d{5})$
EC ^([a-zA-Z]\d{4}[a-zA-Z])$
EE ^(\d{5})$
EG ^(\d{5})$
ES ^(\d{5})$
ET ^(\d{4})$
FI ^(?:FI)*(\d{5})$
FM ^(\d{5})$
FO ^(?:FO)*(\d{3})$
FR ^(\d{5})$
GB ^(([A-Z]\d{2}[A-Z]{2})|([A-Z]\d{3}[A-Z]{2})|([A-Z]{2}\d{2}[A-Z]{2})|([A-Z]{2}\d{3}[A-Z]{2})|([A-Z]\d[A-Z]\d[A-Z]{2})|([A-Z]{2}\d[A-Z]\d[A-Z]{2})|(GIR0AA))$
GE ^(\d{4})$
GF ^((97|98)3\d{2})$
GG ^(([A-Z]\d{2}[A-Z]{2})|([A-Z]\d{3}[A-Z]{2})|([A-Z]{2}\d{2}[A-Z]{2})|([A-Z]{2}\d{3}[A-Z]{2})|([A-Z]\d[A-Z]\d[A-Z]{2})|([A-Z]{2}\d[A-Z]\d[A-Z]{2})|(GIR0AA))$
GL ^(\d{4})$
GP ^((97|98)\d{3})$
GR ^(\d{5})$
GT ^(\d{5})$
GU ^(969\d{2})$
GW ^(\d{4})$
HN ^([A-Z]{2}\d{4})$
HR ^(?:HR)*(\d{5})$
HT ^(?:HT)*(\d{4})$
HU ^(\d{4})$
ID ^(\d{5})$
IL ^(\d{5})$
IM ^(([A-Z]\d{2}[A-Z]{2})|([A-Z]\d{3}[A-Z]{2})|([A-Z]{2}\d{2}[A-Z]{2})|([A-Z]{2}\d{3}[A-Z]{2})|([A-Z]\d[A-Z]\d[A-Z]{2})|([A-Z]{2}\d[A-Z]\d[A-Z]{2})|(GIR0AA))$
IN ^(\d{6})$
IQ ^(\d{5})$
IR ^(\d{10})$
IS ^(\d{3})$
IT ^(\d{5})$
JE ^(([A-Z]\d{2}[A-Z]{2})|([A-Z]\d{3}[A-Z]{2})|([A-Z]{2}\d{2}[A-Z]{2})|([A-Z]{2}\d{3}[A-Z]{2})|([A-Z]\d[A-Z]\d[A-Z]{2})|([A-Z]{2}\d[A-Z]\d[A-Z]{2})|(GIR0AA))$
JO ^(\d{5})$
JP ^(\d{7})$
KE ^(\d{5})$
KG ^(\d{6})$
KH ^(\d{5})$
KP ^(\d{6})$
KR ^(?:SEOUL)*(\d{6})$
KW ^(\d{5})$
KZ ^(\d{6})$
LA ^(\d{5})$
LB ^(\d{4}(\d{4})?)$
LI ^(\d{4})$
LK ^(\d{5})$
LR ^(\d{4})$
LS ^(\d{3})$
LT ^(?:LT)*(\d{5})$
LU ^(\d{4})$
LV ^(?:LV)*(\d{4})$
MA ^(\d{5})$
MC ^(\d{5})$
MD ^(?:MD)*(\d{4})$
ME ^(\d{5})$
MG ^(\d{3})$
MK ^(\d{4})$
MM ^(\d{5})$
MN ^(\d{6})$
MQ ^(\d{5})$
MT ^([A-Z]{3}\d{2}\d?)$
MV ^(\d{5})$
MX ^(\d{5})$
MY ^(\d{5})$
MZ ^(\d{4})$
NC ^(\d{5})$
NE ^(\d{4})$
NF ^(\d{4})$
NG ^(\d{6})$
NI ^(\d{7})$
NL ^(\d{4}[A-Z]{2})$
NO ^(\d{4})$
NP ^(\d{5})$
NZ ^(\d{4})$
OM ^(\d{3})$
PF ^((97|98)7\d{2})$
PG ^(\d{3})$
PH ^(\d{4})$
PK ^(\d{5})$
PL ^(\d{5})$
PM ^(97500)$
PR ^(\d{9})$
PT ^(\d{7})$
PW ^(96940)$
PY ^(\d{4})$
RE ^((97|98)(4|7|8)\d{2})$
RO ^(\d{6})$
RS ^(\d{6})$
RU ^(\d{6})$
SA ^(\d{5})$
SD ^(\d{5})$
SE ^(?:SE)*(\d{5})$
SG ^(\d{6})$
SH ^(STHL1ZZ)$
SI ^(?:SI)*(\d{4})$
SK ^(\d{5})$
SM ^(4789\d)$
SN ^(\d{5})$
SO ^([A-Z]{2}\d{5})$
SV ^(?:CP)*(\d{4})$
SZ ^([A-Z]\d{3})$
TC ^(TKCA 1ZZ)$
TH ^(\d{5})$
TJ ^(\d{6})$
TM ^(\d{6})$
TN ^(\d{4})$
TR ^(\d{5})$
TW ^(\d{5})$
UA ^(\d{5})$
US ^\d{5}(-\d{4})?$
UY ^(\d{5})$
UZ ^(\d{6})$
VA ^(\d{5})$
VE ^(\d{4})$
VI ^\d{5}(-\d{4})?$
VN ^(\d{6})$
WF ^(986\d{2})$
YT ^(\d{5})$
ZA ^(\d{4})$
ZM ^(\d{5})$
CS ^(\d{5})$

Mam nadzieję, że nie popełniłem błędu, moje wyrażenie regularne jest dość słabe.


1
Chciałbym zauważyć, że regex dla Francji i Wielkiej Brytanii nie uwzględnia możliwych spacji; We Francji kody pocztowe można wprowadzać ze spacją między drugą a trzecią cyfrą (tj. 75 001 zamiast 75001). Brytyjskie kody pocztowe są dość często pisane spacją (tj. SW1 1AA zamiast SW11AA).
salcoin

@salcoin Dzięki za wkład, nie zauważyłem tego (mimo że jestem Francuzem). Wygląda na to, że odpowiedź Chi jest pod tym względem lepsza.
nha

bo str_replace spacja bez spacji jest super podatkowa, prawda? : p
Robert Pounder,

6

Jeśli ktoś nadal jest zainteresowany sprawdzaniem poprawności kodów pocztowych, znalazłem rozwiązanie:

Korzystanie Google Geocoding APImożemy sprawdzić ważność kodu pocztowego posiadającego zarówno kod kraju i ZIP sam kod.

Na przykład mieszkam na Ukrainie, więc mogę sprawdzić w ten sposób: https://maps.googleapis.com/maps/api/geocode/json?components=postal_code:80380|country:UA

Lub używając JS API: https://developers.google.com/maps/documentation/javascript/geocoding#ComponentFiltering

Gdzie 80380jest ważny kod pocztowy dla Ukrainy, właściwie każdy (#####) jest ważny.

Google zwraca ZERO_RESULTSstatus, jeśli nic nie znaleziono. Lub OKwynik, jeśli oba są poprawne.

Mam nadzieję, że to będzie pomocne.


Jedynym problemem będzie ograniczenie liczby zapytań, które w zależności od strony / rozmiaru mogą być problemem.
Darryl Hein

@DarrylHein oczywiście, ale teraz jest to całkiem spora cena, żeby to działało =)
Romko


2

Problem polega na tym, że prawdopodobnie nie masz dobrych środków, aby nadążyć za zmieniającymi się wymaganiami dotyczącymi kodów pocztowych w krajach po drugiej stronie globu i których nie znasz wspólnych języków. Jeśli nie masz wystarczająco dużego budżetu, aby to wyśledzić, prawie na pewno lepiej powierzyć odpowiedzialność za sprawdzanie adresów w Google lub Yahoo.

Obie firmy oferują funkcje wyszukiwania adresów za pomocą programowalnego interfejsu API.


1

Dlaczego to robisz i dlaczego cię to obchodzi? Jak zauważył Tom Ritter, nie ma znaczenia, czy w ogóle masz kod pocztowy / pocztowy, a tym bardziej czy jest on ważny, czy nie, dopóki nie wyślesz czegoś na ten adres. Nawet jeśli spodziewasz się, że pewnego dnia je wyślesz , nie oznacza to, że potrzebujesz dzisiaj kodu pocztowego .


Tak, ale jeśli mają zamiar wejść do jednego, równie dobrze upewnij się, że w tym momencie jest to poprawne. Zgadzam się jednak z jedną z pozostałych odpowiedzi, które w gruncie rzeczy mówią, spraw, by były one poprawne dla krajów, które Twoim zdaniem będą stanowić większość Twoich klientów.
cdmckay

1
Niektóre izby rozliczeń kredytowych nie zaakceptują rachunku, chyba że kod pocztowy jest prawidłowy. Wolę sprawdzić poprawność zip na wejściu, niż przesłać opłatę i odrzucić.
SamGoody

1

Jak zauważono w innym miejscu, różnorodność na całym świecie jest ogromna. I nawet jeśli coś pasującego do wzoru nie oznacza, że ​​istnieje.

Oczywiście jest wiele miejsc, w których kody pocztowe nie są używane (np. Dużo lub Irlandia).


Właściwie prawdopodobnie cała Irlandia, ponieważ nie uważam D1, D2 itp. Za właściwe kody pocztowe, ponieważ nie można zidentyfikować adresu za pomocą tego kodu i numeru ulicy.
Dónal

1

Dokładny kod pocztowy ma inne przyczyny niż wysyłka. Biura podróży odbywające wycieczki transgraniczne (oczywiście poza strefą euro) potrzebują tych informacji z wyprzedzeniem, aby przekazać je władzom. Często informacje te są wprowadzane przez agenta, który może, ale nie musi znać takich rzeczy. DOWOLNĄ metodą, która pozwala ograniczyć liczbę błędów, jest Good Idea ™

Jednak napisanie wyrażenia regularnego obejmującego wszystkie kody pocztowe na świecie byłoby szalone.


1
Jest to dobry pomysł, dopóki kod nie zacznie odrzucać prawidłowych kodów pocztowych albo z powodu błędów, albo z powodu zmiany kodów pocztowych. Walidacja jest czymś, co albo musi mieć rację, albo wcale. Przynajmniej powinna istnieć opcja zastąpienia.
Chas. Owens

1

Biorąc pod uwagę, że dla każdego kraju jest tak wiele przypadków skrajnych (np. Adresy w Londynie mogą używać nieco innego formatu niż w pozostałej części Wielkiej Brytanii), nie sądzę, że istnieje regex inny niż może:

[0-9a-zA-Z]+

Najlepiej pójść z dość szerokim wzorem (dobrze nie tak szerokim jak powyżej) lub traktować każdy kraj / region z własnym wzorem!

AKTUALIZACJA: Może być jednak możliwe dynamiczne skonstruowanie wyrażenia regularnego w oparciu o wiele mniejszych reguł specyficznych dla regionu - choć nie jestem pewien wydajności!

Wiele wzorców specyficznych dla kraju można znaleźć na stronie RegExLib .


1

Ktoś pytał o listę formatowania adresów mailowych i myślę, że tego właśnie szukał ...

Kompulsywny przewodnik Franka po adresach pocztowych: http://www.columbia.edu/~fdc/postal/ Jednak niewiele pomaga w kwestiach na poziomie ulicy.

Moja praca korzysta z kilku narzędzi, które pomagają w tym: - Usługi Lexis-Nexis, w tym wyszukiwania NCOA (otrzymasz standaryzację adresu za „bezpłatnie”) - „Melissa Data” http://www.melissadata.com


1

To jest bardzo prosty RegEx do sprawdzania amerykańskiego kodu pocztowego (nie ZipCode Plus Four):

(?!([089])\1{4})\d{5}

Wydaje się, że wszystkie pięciocyfrowe numery są prawidłowymi kodami pocztowymi, z wyjątkiem 00000, 88888& 99999.

Przetestowałem ten RegEx z http://regexpal.com/

SP


RegEx nie wymusza czterech cyfr dla części zip + 4. Np. Uważa „92122-1” za prawidłowy kod pocztowy.
Sensei James

0

Jeśli Zip Codezezwala na znaki i cyfry (alfanumeryczne), poniżej wyrażenia regularnego użyje się tam, gdzie pasuje, 5 lub 9 lub 10 znaków alfanumerycznych z jednym łącznikiem ( -):

^([0-9A-Za-z]{5}|[0-9A-Za-z]{9}|(([0-9a-zA-Z]{5}-){1}[0-9a-zA-Z]{4}))$
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.