Apa kode pos utama dan kode pos?


201

Saya mencari kode pos utama dan kode pos. Saya mencari sesuatu yang akan mencakup sebagian besar (semoga semua) dunia.


4
Satu regex tunggal untuk semua kode pos tidak akan berguna untuk kebanyakan kasus, belum lagi membutuhkan banyak pengkodean unicode. Jauh lebih baik untuk memeriksa regex berdasarkan negara-demi-negara sehingga Anda tidak memvalidasi hal-hal seperti "New York, NY AF23Q" sebagai benar.
Ya - Jake itu.

101
Anda punya masalah. Anda menulis regex untuk itu. Sekarang Anda memiliki dua masalah.
Robert S.


2
Yang menangani semua kemungkinan nilai masa depan.
Jodrell

Jawaban:


127

Tidak ada.

Kode pos / pos di seluruh dunia tidak mengikuti pola umum. Di beberapa negara mereka dibuat oleh angka, di negara lain mereka dapat kombinasi angka dan huruf, beberapa dapat berisi spasi, titik lainnya, jumlah karakter dapat bervariasi dari dua hingga setidaknya enam ...

Apa yang bisa Anda lakukan (secara teoritis) adalah membuat regex terpisah untuk setiap negara di dunia, bukan IMO yang direkomendasikan. Tetapi Anda masih akan hilang pada bagian validasi: Kode pos 12345mungkin ada, tetapi 12346tidak, mungkin 12344juga tidak ada. Bagaimana Anda memeriksanya dengan regex?

Kamu tidak bisa


Saya menduga bahwa regex dapat dikompilasi, tetapi tugas seperti ini jauh lebih cocok untuk database. Regex akan terlihat seperti 10000 | 10001 | 10002 | 10003 | .......
Kibbee

untuk memvalidasi bidang, buka di sini regexlib.com/Search.aspx?k=decimal&c=3&m=-1&ps=100
Dinesh Kumar

Anda dapat menggunakan regexp pertama yang cocok dengan negara Anda (lihat en.wikipedia.org/wiki/List_of_postal_codes ) dan lakukan pemeriksaan nyata oleh layanan eksternal seperti geonames.org/export/ws-overview.html
SimonSimCity

3
Dua sen saya: di Brazil sebenarnya 8 angka, 5 diikuti dengan tanda hubung dan 3 lainnya
Jorge Campos

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

261

Unicode CLDR berisi regex kode pos untuk setiap negara. (Total 158 regex!)

Google juga memiliki layanan web dengan informasi pemformatan alamat per negara, termasuk kode pos, di sini - http://i18napis.appspot.com/address (saya menemukan tautan itu melalui http://unicode.org/review/pri180/ )

Edit

Berikut salinan regex 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
Hanya dengan pemindaian cepat kode pos AU-regex ... regex ini sangat sederhana dan memungkinkan banyak kesalahan positif, jadi tidak lengkap.
Taryn East

7
Versi terbaru dari unicode CLDR yang berisi regex kode pos adalah versi 26.0.1. Dalam versi yang lebih baru telah dihapus karena data tidak dipelihara dan tidak ada sumber terpercaya lainnya yang dapat ditemukan.
Perangkat Lunak KIKO

1
Sama, sangat mendasar untuk regex kode pos Prancis. Gunakan yang ini "^ ((0 [1-9]) | ([1-8] [0-9]) | (9 [0-8]) | (2A) | (2B)) [0-9] {3} $ "-> developpez.net/forums/d518232/webmasters-developpement-web/…
Vincent D.

Saya menggunakan i18napis.appspot.com/address/data/GB sekarang; Adakah masalah dengan layanan ini?
mgol

1
Koreksi kecil ke komentar @ kiko-software: versi terbaru yang berisi data kode pos adalah 27.0.3 .
Sietse

89

gunakan regx ini

$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
Salah satu upaya terbaik yang saya lihat benar-benar menjawab OP. Dapatkan lebih lambat karena iklan Anda lebih banyak tetapi pendekatan yang bersih dan jelas.
Rob

3
Itu tidak menjadi lebih lambat ketika Anda menambahkan lebih banyak seperti yang disarankan Rob karena Anda akan memilih salah satu regex dari kode negara.
Thomaschaaf

2
Saya melihat Anda memposting ini pada 2012. Sudah ada sejak itu?
rybo111

@ rybo111 periksa jawaban Chi.
Giulio Caccin

5
@ ddunn801, ada perbedaan (mengompol besar) antara memvalidasi pola dan mengotentikasi kode pos. Otentikasi kode adalah keseluruhan urutan besarnya lebih sulit karena (setidaknya di AS) kode pos ditambahkan dan dihapus secara teratur. Di dunia yang ideal, Anda akan melakukan pemeriksaan cepat untuk memvalidasi pola sebelum mengirimkan ke layanan (misalnya, USPS) untuk memvalidasi seluruh alamat surat (layanan seperti ini dibayar, Anda akan benci membuang-buang nilai dengan data yang buruk ). Sayangnya, dunia jauh dari ideal.
JBH

48
  1. Setiap sistem kode pos hanya menggunakan AZ dan / atau 0-9 dan terkadang spasi / tanda hubung

  2. Tidak setiap negara menggunakan kode pos (mis. Irlandia di luar Dublin), tetapi kami akan mengabaikannya di sini.

  3. Format kode pos terpendek adalah Sierra Leone dengan NN

  4. Yang terpanjang adalah Samoa Amerika NNNNN-NNNNNN

  5. Anda harus mengizinkan satu spasi atau tanda hubung.

  6. Seharusnya tidak dimulai atau diakhiri dengan spasi atau tanda hubung

Ini harus mencakup yang di atas:

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

8
Ini tampaknya menjadi satu-satunya jawaban yang memberikan pemeriksaan kewarasan (yang mungkin adalah apa yang diinginkan OP) daripada validasi penuh dari setiap kombinasi yang mungkin. Tepat seperti yang kuinginkan thx
Lukos

1
@GiulioCaccin H0H0H0 adalah Kode Pos Kanada yang valid (yang digunakan anak-anak untuk mendapatkan surat dari Canada Post yang berpura-pura sebagai Santa Claus), tetapi itu tidak berarti itu kode pos pelanggan yang valid :)
Neil McGuigan

2
FYI, Samoa Amerika cukup kecil untuk hanya memiliki satu kode pos dan 96799
naterkane

5
Menurut pendapat saya ini adalah satu-satunya jawaban yang baik. Misalnya, secara universal dapat digunakan sebagai pra-validasi dalam atribut pola HTML.
Blackbam

2
Saya pikir ini adalah jawaban yang baik untuk situasi di mana seseorang hanya ingin melakukan pemeriksaan kewarasan dan tidak memvalidasi sebelumnya per negara. Hanya untuk memiliki sedikit data yang lebih bersih tanpa banyak usaha - dalam kasus di mana keamanan penuh diperlukan, plugin / layanan pihak ketiga mungkin diperlukan seperti yang ditunjukkan orang lain.
Yo Ludke

17

Mencoba untuk menutupi seluruh dunia dengan satu ekspresi reguler tidak sepenuhnya mungkin, dan tentu saja tidak layak atau direkomendasikan.

Bukan untuk membunyikan klakson saya sendiri, tetapi saya telah menulis beberapa ekspresi reguler yang cukup menyeluruh yang mungkin berguna bagi Anda.

  • Kode pos Kanada

    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}$
  • Kode ZIP AS

    ^[0-9]{5}(-[0-9]{4})?$
  • Kode pos UK

    ^([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))$

Tidak mungkin untuk menjamin keakuratan tanpa benar-benar mengirimkan sesuatu ke alamat dan meminta orang tersebut memberi tahu Anda ketika mereka menerimanya, tetapi kami dapat mempersempit hal-hal dengan mengurangi kasus-kasus yang kami tahu buruk.


Versi diperpanjang untuk Kode Pos Kanada mungkin memiliki sesuatu yang salah atau hilang, karena dikatakan bahwa kode pos berikut ini tidak valid: E3G 0A1, meskipun itu kode yang valid.
fsschmitt

Saya telah memvalidasi terhadap semua 845.495 kode pos di Kanada dan string regex ini memiliki beberapa perbaikan pada validasi Diperpanjang untuk mendukung semua kode pos ini. Berikut adalah string regex baru untuk validasi diperpanjang pada Kode Pos Kanada: pastebin.com/vazqFKy4
fsschmitt

14

Ini terlihat seperti referensi yang baik meskipun tidak di Regex.

Sungguh, kecuali Anda benar-benar mengirimkan sesuatu kepada pengguna Anda, saya tidak berpikir itu sepadan dengan usaha. Dan jika Anda sedang pengiriman itu, ada alamat membersihkan alat / jasa Anda dapat melihat ke dalam untuk membuatnya cara yang lebih mudah pada diri Anda sendiri.


Juga, bahkan jika itu adalah kode pos yang benar hari ini, sangat mungkin akan berubah di masa depan. USPS terus-menerus menambahkan yang baru dan area pemisahan. Satu-satunya cara Anda dapat mengikuti adalah untuk memvalidasi pada saat Anda benar-benar mengirimkan sesuatu. Beberapa kota bahkan memilih untuk mengubah kode pos mereka sendiri karena berbagai alasan.
NotMe

Sepertinya seseorang mengambil artikel wiki yang Anda posting di atas dan mengeluarkannya ke JSON dengan kode pos / kode pos untuk masing-masing negara - gist.github.com/matthewbednarski/…
Chris Smith

8

Kami menggunakan yang berikut ini:

Kanada

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

Amerika

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

Lain

Terima apa adanya


1
Saya sarankan menambahkan opsional - [0-9] {4} ke AS. Beberapa orang menggunakan ZIP + 4 mereka.
David Thornley

4
/ [0-9] {5} (?: - [0-9] {4})? / Memungkinkan Anda memvalidasi kedua gaya dari AS secara bersamaan.
Chas. Owens

2
@ Chas.Owens menambahkan ^ dan $ memastikan mereka tidak bisa mengetik apa pun sebelum atau sesudah, seperti "12345aaa" ... / ^ [0-9] {5} (?: - [0-9] {4}) ? $ /
Tim Franklin

7

Tergantung pada aplikasi Anda, Anda mungkin ingin menerapkan pencocokan regex untuk negara-negara di mana sebagian besar pengunjung Anda berasal dan tidak ada validasi untuk sisanya (menerima apa pun).


6
.* 

Lompatan Besar lupa tentang jeda baris, kosong, dan karakter kontrol.

Kode pos internasional adalah semacam masalah penghentian.


6

Harap dicatat bahwa ini adalah masalah yang cukup sulit, sebagaimana dinyatakan oleh jawaban yang diterima. Saya kira itu tidak menghalangi orang-orang di geonames.org . Mereka memiliki file file info negara , yang tidak cocok sepenuhnya ke dalam jawaban ini - batasnya pada 30000 karakter tampaknya. Ada regex untuk sekitar 150 negara.

Saya mengekstrak bit yang relevan dengan pertanyaan ini di sini:

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})$

Semoga saya tidak melakukan kesalahan, regex-fu saya cukup lemah.


1
Saya ingin menunjukkan bahwa regex untuk Perancis dan Inggris tidak memperhitungkan kemungkinan ruang; Di Prancis, kode pos dapat dimasukkan dengan spasi antara digit kedua dan ketiga (yaitu 75 001 bukannya 75001). Kode pos Inggris cukup sering ditulis dengan spasi (yaitu SW1 1AA, bukan SW11AA).
salcoin

@salcoin Terima kasih atas masukannya, saya tidak menyadarinya (meskipun saya orang Prancis). Sepertinya jawaban Chi lebih baik dalam hal ini.
nha

karena str_replace spasi tanpa spasi super melelahkan bukan? : p
Robert Pounder

6

Jika seseorang masih tertarik dengan cara memvalidasi kode pos, saya sudah menemukan solusinya:

Dengan menggunakan Google Geocoding APIkita dapat memeriksa validitas kode ZIP yang memiliki kode Negara dan kode ZIP itu sendiri.

Misalnya saya tinggal di Ukraina sehingga saya dapat memeriksa seperti ini: https://maps.googleapis.com/maps/api/geocode/json?components=postal_code:80380|country:UA

Atau menggunakan JS API: https://developers.google.com/maps/documentation/javascript/geocoding#ComponentFiltering

Di mana 80380ZIP yang valid untuk Ukraina, sebenarnya setiap (#####) valid.

Google mengembalikan ZERO_RESULTSstatus jika tidak ada yang ditemukan. Atau OKdan hasilnya jika keduanya benar.

Semoga ini bisa membantu.


Satu-satunya masalah adalah batas jumlah kueri, yang, tergantung pada situs / ukuran, bisa menjadi masalah.
Darryl Hein

@DarrylHein tentu saja tapi itu sekarang harga yang cukup besar untuk membuatnya bekerja =)
Romko


2

Masalahnya adalah bahwa Anda mungkin tidak memiliki sarana yang baik untuk mengikuti perubahan persyaratan kode pos negara-negara di sisi lain dunia dan Anda tidak memiliki bahasa yang sama. Kecuali Anda memiliki anggaran yang cukup besar untuk melacak ini, Anda hampir pasti lebih baik memberikan tanggung jawab untuk memvalidasi alamat ke google atau yahoo.

Kedua perusahaan menyediakan fasilitas pencarian alamat melalui API yang dapat diprogram.


1

Mengapa Anda melakukan ini dan mengapa Anda peduli? Seperti yang ditunjukkan oleh Tom Ritter, tidak masalah apakah Anda memiliki kode pos / ZIP sama sekali, apalagi apakah itu valid atau tidak, sampai dan kecuali Anda benar-benar akan mengirim sesuatu ke alamat itu. Bahkan jika Anda berharap bahwa Anda akan mengirim sesuatu kepada mereka suatu hari nanti , itu tidak berarti Anda memerlukan kode pos hari ini .


Ya tetapi jika mereka akan memasukkan satu, mungkin juga memastikan itu benar pada saat itu. Namun, saya setuju dengan salah satu jawaban lain yang pada dasarnya mengatakan, buat validasi untuk negara-negara yang menurut Anda akan menjadi mayoritas pelanggan Anda.
cdmckay

1
Beberapa lembaga kliring kredit tidak akan menerima tagihan kecuali posnya benar. Saya lebih suka memvalidasi zip pada input, daripada mengirimkan tagihan dan menolaknya.
SamGoody

1

Sebagaimana dicatat di tempat lain, variasi di seluruh dunia sangat besar. Dan bahkan jika sesuatu yang cocok dengan polanya tidak berarti itu ada.

Kemudian, tentu saja, ada banyak tempat di mana kode pos tidak digunakan (misalnya banyak atau Irlandia).


Sebenarnya, mungkin semua Irlandia, karena saya tidak berpikir D1, D2, dll dianggap kode pos yang tepat karena Anda tidak dapat mengidentifikasi alamat hanya menggunakan kode ini dan nomor jalan.
Dónal

1

Ada alasan di luar pengiriman karena memiliki kode pos yang akurat. Agen perjalanan yang melakukan tur yang melintasi perbatasan (kecuali Zona Euro tentu saja) memerlukan informasi ini sebelumnya untuk diberikan kepada pihak berwenang. Seringkali informasi ini dimasukkan oleh agen yang mungkin atau mungkin tidak terbiasa dengan hal-hal seperti itu. Setiap metode yang dapat mengurangi kesalahan adalah Good Idea ™

Namun, menulis sebuah regex yang akan mencakup semua kode pos di dunia akan menjadi gila.


1
Itu hanya ide yang baik sampai kode mulai menolak kode pos yang valid baik karena buggy atau kode pos telah berubah. Validasi adalah sesuatu yang harus benar atau tidak ada sama sekali. Paling tidak harus ada opsi override.
Chas. Owens

1

Mengingat bahwa ada begitu banyak kasus tepi untuk masing-masing negara (mis. Alamat London dapat menggunakan format yang sedikit berbeda dengan bagian lain di Inggris) Saya tidak berpikir bahwa ada regex utama selain mungkin:

[0-9a-zA-Z]+

Lebih baik menggunakan pola yang cukup luas (juga tidak seluas seperti di atas), atau perlakukan setiap negara / wilayah dengan pola spesifiknya sendiri!

PEMBARUAN: Namun, dimungkinkan untuk secara dinamis membangun regex berdasarkan banyak aturan spesifik kawasan yang lebih kecil - meskipun tidak yakin tentang kinerja!

Banyak pola spesifik negara dapat ditemukan di situs RegExLib .


1

Seseorang bertanya tentang daftar pemformatan alamat surat, dan saya pikir inilah yang dia cari ...

Panduan Kompulsif Frank untuk Alamat Pos: http://www.columbia.edu/~fdc/postal/ Tidak banyak membantu dengan masalah tingkat jalanan.

Pekerjaan saya menggunakan beberapa alat untuk membantu dengan ini: - Layanan Lexis-Nexis, termasuk pencarian NCOA (Anda akan mendapatkan standardisasi alamat untuk "gratis") - "Melissa Data" http://www.melissadata.com


1

Ini adalah RegEx yang sangat sederhana untuk memvalidasi Kode Pos AS (bukan Kode Pos Plus Empat):

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

Tampaknya semua angka lima digit adalah kode pos yang valid kecuali 00000 , 88888& 99999.

Saya telah menguji RegEx ini dengan http://regexpal.com/

SP


RegEx ini tidak memberlakukan empat digit untuk bagian zip + 4. Misalnya itu menganggap "92122-1" kode pos yang valid.
Sensei James

0

Jika Zip Codememungkinkan karakter dan digit (alfanumerik), regex di bawah ini akan digunakan di tempat yang cocok, 5 atau 9 atau 10 karakter alfanumerik dengan satu hypen ( -):

^([0-9A-Za-z]{5}|[0-9A-Za-z]{9}|(([0-9a-zA-Z]{5}-){1}[0-9a-zA-Z]{4}))$
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.