Mã bưu chính cuối cùng và regex zip là gì?


201

Tôi đang tìm kiếm mã bưu chính và mã zip cuối cùng. Tôi đang tìm kiếm thứ gì đó sẽ bao gồm hầu hết (hy vọng là tất cả) trên thế giới.


4
Một regex duy nhất cho tất cả các mã bưu chính sẽ vô dụng đối với hầu hết các trường hợp, chưa kể đến việc yêu cầu nhiều mã hóa unicode. Tốt hơn nhiều là kiểm tra regex trên cơ sở từng quốc gia để bạn không xác thực những thứ như "New York, NY AF23Q" là chính xác.
Vâng - Jake đó.

101
Bạn có một vấn đề. Bạn viết một regex cho nó. Bây giờ bạn có hai vấn đề.
Robert S.

regexlib.com/Search.aspx?k=decimal&c=3&m=-1&ps=100 để xác thực một trường tại đây
Dinesh Kumar

2
Một trong đó xử lý tất cả các giá trị có thể trong tương lai.
Jodrell

Câu trả lời:


127

Chẳng có ai.

Mã bưu chính / mã zip trên toàn thế giới không theo một mô hình chung. Ở một số quốc gia, chúng được tạo thành bởi các số, ở các quốc gia khác, chúng có thể là tổ hợp số của một chữ cái, một số có thể chứa dấu cách, các dấu chấm khác, số lượng ký tự có thể thay đổi từ hai đến ít nhất sáu ...

Những gì bạn có thể làm (về mặt lý thuyết) là tạo ra một biểu thức riêng biệt cho mọi quốc gia trên thế giới, không khuyến nghị IMO. Nhưng bạn vẫn sẽ bị thiếu trong phần xác thực: Mã zip 12345có thể tồn tại, nhưng 12346không, có lẽ 12344cũng không tồn tại. Làm thế nào để bạn kiểm tra điều đó với một regex?

Bạn không thể.


Tôi nghi ngờ rằng một regex có thể được biên dịch, nhưng một tác vụ như thế này phù hợp hơn với cơ sở dữ liệu. Regex sẽ trông giống như 10000 | 10001 | 10002 | 10003 | .......
Kibbee

để xác thực một trường, hãy truy cập vào đây regexlib.com/Search.aspx?k=decimal&c=3&m=-1&ps=100
Dinesh Kumar

Trước tiên, bạn có thể sử dụng biểu thức chính quy phù hợp với quốc gia của mình (xem en.wikipedia.org/wiki/List_of_postal_codes ) và thực hiện kiểm tra thực tế bởi một dịch vụ bên ngoài như geonames.org/export/ws-overview.html
SimonSimCity

3
Hai xu của tôi: ở Brazil thực tế là 8 số, 5 số theo sau là một dấu gạch ngang và 3 số nữa
Jorge Campos

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

260

CLDR unicode chứa regex mã bưu chính cho mỗi quốc gia. (Tổng cộng 158 regex!)

Google cũng có một dịch vụ web với thông tin định dạng địa chỉ theo quốc gia, bao gồm mã bưu chính, tại đây - http://i18napis.appspot.com/address (Tôi tìm thấy liên kết đó qua http://unicode.org/review/pri180/ )

Biên tập

Đây là một bản sao của 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
Chỉ cần quét nhanh mã bưu chính AU-regex ... regex này rất đơn giản và sẽ cho phép rất nhiều thông tin sai lệch thông qua, vì vậy nó không đầy đủ.
Taryn Đông

7
Phiên bản mới nhất của CLDR unicode chứa regex mã bưu chính là phiên bản 26.0.1. Trong các phiên bản sau, nó đã bị xóa vì dữ liệu không được duy trì và không có nguồn đáng tin cậy nào khác có thể được tìm thấy.
Phần mềm KIKO

1
Tương tự, rất cơ bản cho regex mã Zip Pháp. Sử dụng cái này "^ ((0 [1-9]) | ([1-8] [0-9]) | (9 [0-8]) | (2A) | (2B)) [0-9] {3} $ "-> Developpez.net/forums/d518232/webmasters-developpement-web/ trộm
Vincent D.

Tôi đang sử dụng i18napis.appspot.com/address/data/GB ngay bây giờ; Có bất kỳ vấn đề với dịch vụ này?
mgol

1
Sửa lỗi nhỏ cho nhận xét của @ kiko-software: phiên bản mới nhất chứa dữ liệu mã bưu chính là 27.0.3 .
Sietse

89

sử dụng những regx này

$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
Một trong những nỗ lực tốt hơn tôi từng thấy để thực sự trả lời OP. Hãy chậm hơn khi bạn quảng cáo nhiều hơn nhưng cách tiếp cận rõ ràng và rõ ràng.
Cướp

3
Nó không trở nên chậm hơn khi bạn thêm nhiều hơn như Rob gợi ý vì bạn sẽ chọn một trong các biểu thức chính từ mã quốc gia.
Thomaschaaf

2
Tôi thấy bạn đã đăng bài này vào năm 2012. Còn gì nữa không?
rybo111

@ rybo111 kiểm tra Chi trả lời.
Giulio Caccin

5
@ ddunn801, có một sự khác biệt (lớn) giữa việc xác thực mẫu và xác thực mã bưu chính. Xác thực mã là toàn bộ các đơn đặt hàng có độ lớn khó khăn hơn vì (ít nhất là ở Mỹ) mã bưu chính được thêm và bỏ thường xuyên. Trong một thế giới lý tưởng, bạn sẽ thực hiện kiểm tra nhanh để xác thực mẫu trước khi gửi dịch vụ (ví dụ: USPS) để xác thực toàn bộ địa chỉ gửi thư (các dịch vụ như thế này được thanh toán, bạn không muốn lãng phí giá trị với dữ liệu xấu ). Than ôi, thế giới là xa lý tưởng.
JBH

48
  1. Mỗi hệ thống mã bưu chính chỉ sử dụng AZ và / hoặc 0-9 và đôi khi không gian / dấu gạch ngang

  2. Không phải mọi quốc gia đều sử dụng mã bưu chính (ví dụ Ireland bên ngoài Dublin), nhưng chúng tôi sẽ bỏ qua điều đó ở đây.

  3. Định dạng mã bưu chính ngắn nhất là Sierra Leone với NN

  4. Lâu nhất là Samoa Mỹ với NNNNN-NNNNNN

  5. Bạn nên cho phép một không gian hoặc dấu gạch ngang.

  6. Không nên bắt đầu hoặc kết thúc với không gian hoặc dấu gạch ngang

Điều này sẽ bao gồm những điều trên:

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

8
Đây dường như là câu trả lời duy nhất cung cấp kiểm tra độ tỉnh táo (có lẽ là điều OP muốn) hơn là xác nhận đầy đủ mọi kết hợp có thể. Chính xác những gì tôi muốn thx
Lukos

1
@GiulioCaccin H0H0H0 là Mã Bưu chính Canada hợp lệ (mà trẻ em sử dụng để nhận thư từ Canada Post giả danh Santa Claus), nhưng điều đó không có nghĩa đó là mã bưu chính của khách hàng hợp lệ :)
Neil McGuigan

2
FYI, Samoa Mỹ đủ nhỏ để chỉ có một mã bưu điện và đó là 96799
naterkane

5
Theo tôi đây là câu trả lời tốt duy nhất. Ví dụ, nó có thể được sử dụng làm xác thực trước trong thuộc tính mẫu HTML.
Blackbam

2
Tôi nghĩ rằng đây là một câu trả lời tốt cho tình huống mà người ta chỉ muốn kiểm tra sự tỉnh táo và không xác nhận chính xác mỗi quốc gia. Chỉ cần có một dữ liệu sạch hơn một chút mà không cần nhiều nỗ lực - trong trường hợp cần sự an toàn đầy đủ, có thể cần một plugin / dịch vụ của bên thứ ba như những người khác đã chỉ ra.
Yo Ludke

17

Cố gắng bao phủ toàn bộ thế giới bằng một biểu thức chính quy là không hoàn toàn có thể, và chắc chắn là không khả thi hoặc được khuyến nghị.

Không bấm còi của riêng tôi, nhưng tôi đã viết một số biểu thức chính quy khá kỹ lưỡng mà bạn có thể thấy hữu ích.

  • Mã bưu chính Canada

    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}$
  • Mã bưu điện Hoa Kỳ

    ^[0-9]{5}(-[0-9]{4})?$
  • Mã bưu điện Anh

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

Không thể đảm bảo tính chính xác mà không thực sự gửi thư đến một địa chỉ và nhờ người đó cho bạn biết khi họ nhận được, nhưng chúng tôi có thể thu hẹp mọi thứ bằng cách loại bỏ các trường hợp mà chúng tôi biết là xấu.


Phiên bản mở rộng cho Mã bưu chính Canada có thể có lỗi hoặc thiếu, vì nó nói rằng mã bưu chính sau không hợp lệ: E3G 0A1, mặc dù đó là mã hợp lệ.
fsschmitt

Tôi đã xác thực đối với tất cả 845.495 mã bưu chính ở Canada và chuỗi regex này có một số bản sửa lỗi về Xác thực mở rộng để hỗ trợ tất cả các mã bưu chính này. Dưới đây là chuỗi regex mới để xác thực mở rộng trên Mã bưu chính Canada: pastebin.com/vazqFKy4
fsschmitt

14

Đây có vẻ là một tài liệu tham khảo tốt mặc dù nó không có trong Regex.

Thực sự, trừ khi bạn thực sự vận chuyển một cái gì đó cho người dùng của bạn, tôi không nghĩ rằng nó đáng để nỗ lực. Và nếu bạn đang vận chuyển nó, có những công cụ / dịch vụ làm sạch địa chỉ mà bạn có thể xem xét để làm cho nó dễ dàng hơn với chính mình.


Ngoài ra, ngay cả khi đó là mã zip chính xác ngày hôm nay, nó rất có thể sẽ thay đổi trong tương lai. USPS liên tục bổ sung những khu vực mới và khu vực chia tách. Cách duy nhất bạn có thể theo kịp là xác nhận tại thời điểm bạn thực sự vận chuyển một cái gì đó. Một số thị trấn thậm chí chọn thay đổi mã zip của riêng họ vì nhiều lý do.
NotMe

Có vẻ như ai đó đã lấy bài viết wiki mà bạn đã đăng ở trên và xuất nó thành JSON với regex mã bưu chính / mã bưu điện cho mỗi quốc gia - gist.github.com/matthewbednarski/ Lỗi
Chris Smith

8

Chúng tôi sử dụng như sau:

Canada

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

Mỹ

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

Khác

Chấp nhận như là


1
Tôi khuyên bạn nên thêm tùy chọn - [0-9] {4} vào Hoa Kỳ. Một số người sử dụng ZIP + 4 của họ.
David Thornley

4
/ [0-9] {5} (?: - [0-9] {4})? / Cho phép bạn xác thực cả hai kiểu từ Hoa Kỳ cùng một lúc.
Chas. Owens

2
@ Chas.Owens thêm ^ và $ đảm bảo họ không thể nhập bất cứ thứ gì khác trước hoặc sau, như "12345aaa" ... / ^ [0-9] {5} (?: - [0-9] {4}) ? $ /
Tim Franklin

7

Tùy thuộc vào ứng dụng của bạn, bạn có thể muốn triển khai kết hợp regex cho các quốc gia nơi hầu hết khách truy cập của bạn xuất phát và không có xác nhận cho phần còn lại (chấp nhận mọi thứ).


6
.* 

Big Jump quên về ngắt dòng, khoảng trống và ký tự điều khiển.

Mã bưu chính quốc tế là một loại vấn đề tạm dừng.


6

Xin lưu ý rằng đây là một vấn đề khá khó khăn, như đã nêu trong câu trả lời được chấp nhận. Tôi đoán rằng nó đã không ngăn cản mọi người tại geonames.org . Họ có một tệp một tệp thông tin quốc gia , không phù hợp với câu trả lời này - giới hạn rõ ràng là 30000 ký tự. Có regex cho khoảng 150 quốc gia.

Tôi đã trích xuất các bit liên quan đến câu hỏi này ở đây:

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

Hy vọng rằng tôi đã không phạm sai lầm nào, regex-fu của tôi khá yếu.


1
Tôi muốn chỉ ra rằng regex cho Pháp và Vương quốc Anh không tính đến các không gian có thể; Ở Pháp, mã bưu chính có thể được nhập với khoảng trắng giữa chữ số thứ hai và thứ ba (tức là 75 001 thay vì 75001). Mã bưu điện của Anh thường được viết bằng một khoảng trắng (ví dụ SW1 1AA thay vì SW11AA).
salcoin

@salcoin Cảm ơn bạn đã nhập, tôi không nhận thấy điều đó (mặc dù tôi là người Pháp). Có vẻ như câu trả lời của Chi tốt hơn về vấn đề này.
nha

bởi vì str numplace một không gian không có không gian là siêu thuế phải không? : p
Robert Pounder

6

Nếu ai đó vẫn quan tâm đến cách xác thực mã zip, tôi đã tìm thấy giải pháp:

Sử dụng Google Geocoding APIchúng tôi có thể kiểm tra tính hợp lệ của mã ZIP có cả mã quốc gia và chính mã ZIP .

Ví dụ: tôi sống ở Ukraine vì vậy tôi có thể kiểm tra như thế này: https://maps.googleapis.com/maps/api/geocode/json?components=postal_code:80380|country:UA

Hoặc sử dụng API API: https://developers.google.com/maps/documentation/javascript/geocoding#ComponentFiltering

Trường 80380hợp ZIP hợp lệ cho Ukraine, thực tế mọi (#####) đều hợp lệ.

Google trả lại ZERO_RESULTStrạng thái nếu không tìm thấy gì. Hoặc OKvà một kết quả nếu cả hai đều đúng.

Hy vọng điều này sẽ hữu ích.


Vấn đề duy nhất sẽ là giới hạn về số lượng truy vấn, tùy thuộc vào trang web / kích thước, có thể là một vấn đề.
Darryl Hein

@DarrylHein tất nhiên nhưng bây giờ là một mức giá khá lớn để làm cho nó hoạt động =)
Romko

4

Như những người khác đã chỉ ra, một regex để cai trị tất cả là không thể. Tuy nhiên, bạn có thể tạo biểu thức chính quy cho nhiều quốc gia mà bạn cần bằng cách sử dụng thông tin định dạng địa chỉ từ Universal Postal Union - một cơ quan ít được biết đến của Liên Hợp Quốc.

Ví dụ: đây là các quy tắc định dạng địa chỉ, bao gồm mã bưu chính, cho một số quốc gia (định dạng PDF):


2

Vấn đề sẽ là bạn có thể không có phương tiện tốt để theo kịp các yêu cầu thay đổi mã bưu chính của các quốc gia ở phía bên kia địa cầu và bạn không chia sẻ ngôn ngữ chung. Trừ khi bạn có ngân sách đủ lớn để theo dõi điều này, bạn gần như chắc chắn sẽ tốt hơn khi giao trách nhiệm xác thực địa chỉ cho google hoặc yahoo.

Cả hai công ty đều cung cấp các tiện ích tra cứu địa chỉ thông qua API có thể lập trình.


1

Tại sao bạn làm điều này và tại sao bạn quan tâm? Như Tom Ritter đã chỉ ra, việc bạn thậm chí có mã ZIP / bưu chính hay không, không quan trọng đến việc nó có hợp lệ hay không, cho đến khi và trừ khi bạn thực sự sẽ gửi một cái gì đó đến địa chỉ đó. Ngay cả khi bạn mong đợi rằng bạn sẽ gửi cho họ một cái gì đó vào một ngày nào đó , điều đó không có nghĩa là bạn cần một mã bưu chính ngày hôm nay .


Vâng, nhưng nếu họ sẽ nhập một, cũng có thể chắc chắn rằng nó đúng vào thời điểm đó. Tuy nhiên, tôi đồng ý với một trong những câu trả lời khác về cơ bản là nói, làm cho nó hợp lệ cho các quốc gia mà bạn nghĩ sẽ chiếm đa số khách hàng của bạn.
cdmckay

1
Một số nhà thanh toán bù trừ tín dụng sẽ không chấp nhận hóa đơn trừ khi mã zip là chính xác. Tôi thà xác nhận zip trên đầu vào, thay vì gửi phí và bị từ chối.
Samoody

1

Như đã lưu ý ở nơi khác, sự thay đổi trên toàn thế giới là rất lớn. Và ngay cả khi một cái gì đó phù hợp với mô hình không có nghĩa là nó tồn tại.

Sau đó, tất nhiên, có nhiều nơi mà mã bưu điện không được sử dụng (ví dụ như nhiều hoặc Ireland).


Trên thực tế, có lẽ tất cả Ireland, như tôi không nghĩ D1, D2, v.v. được coi là mã bưu điện phù hợp vì bạn không thể xác định địa chỉ chỉ bằng mã này và số đường phố.
Dónal

1

Có nhiều lý do ngoài việc vận chuyển để có một mã bưu chính chính xác. Các công ty du lịch thực hiện các tour du lịch xuyên biên giới (tất nhiên là Eurozone) cần thông tin này trước thời hạn để cung cấp cho chính quyền. Thông thường thông tin này được nhập bởi một đại lý có thể hoặc không quen thuộc với những điều đó. BẤT K method phương pháp nào có thể cắt giảm những sai lầm là một ý tưởng tốt ™

Tuy nhiên, viết một biểu thức chính quy bao gồm tất cả các mã bưu chính trên thế giới sẽ là điên rồ.


1
Nó chỉ là một ý tưởng tốt cho đến khi mã bắt đầu từ chối mã zip hợp lệ vì nó là lỗi hoặc mã zip đã thay đổi. Xác nhận là một cái gì đó phải đúng hoặc không có ở đó. Ít nhất nên có một tùy chọn ghi đè.
Chas. Owens

1

Cho rằng có rất nhiều trường hợp cạnh cho mỗi quốc gia (ví dụ: địa chỉ Luân Đôn có thể sử dụng định dạng hơi khác so với phần còn lại của Vương quốc Anh) Tôi không nghĩ rằng có một biểu thức chính thức khác ngoài có thể:

[0-9a-zA-Z]+

Tốt nhất là đi với một mô hình khá rộng (cũng không hoàn toàn rộng như trên), hoặc đối xử với mỗi quốc gia / khu vực bằng một mô hình cụ thể của riêng mình!

CẬP NHẬT: Tuy nhiên, có thể tự động xây dựng một biểu thức chính quy dựa trên nhiều quy tắc cụ thể theo vùng nhỏ hơn - không chắc chắn về hiệu suất mặc dù!

Rất nhiều mẫu cụ thể của quốc gia có thể được tìm thấy trên trang RegExLib .


1

Ai đó đang hỏi về danh sách các địa chỉ gửi thư định dạng và tôi nghĩ đây là thứ mà anh ta đang tìm kiếm ...

Hướng dẫn bắt buộc của Frank đối với các địa chỉ bưu chính: http://www.columbia.edu/~fdc/postal/ Tuy nhiên, không giúp được gì nhiều cho các vấn đề ở cấp đường phố.

Công việc của tôi sử dụng một số công cụ để hỗ trợ việc này: - Các dịch vụ của Lexis-Nexis, bao gồm tra cứu NCOA (bạn sẽ nhận được tiêu chuẩn hóa địa chỉ cho "miễn phí") - "Dữ liệu Melissa" http://www.melissadata.com


1

Đây là một RegEx rất đơn giản để xác thực Mã Zip Hoa Kỳ (không phải ZipCode Plus Four):

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

Có vẻ như tất cả các số năm chữ số là mã zip hợp lệ ngoại trừ 00000, 88888&99999 .

Tôi đã thử nghiệm RegEx này với http://regExal.com/

SP


RegEx này không thực thi bốn chữ số cho phần zip + 4. Ví dụ: nó coi "92122-1" là mã zip hợp lệ.
Sensei James

0

Nếu Zip Codecho phép các ký tự và chữ số (chữ và số), bên dưới regex sẽ được sử dụng ở nơi khớp với, 5 hoặc 9 hoặc 10 ký tự chữ và số có một dấu gạch ngang ( -):

^([0-9A-Za-z]{5}|[0-9A-Za-z]{9}|(([0-9a-zA-Z]{5}-){1}[0-9a-zA-Z]{4}))$
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.