Qual é o melhor código postal e regex zip?

201

Estou procurando o melhor código postal e código postal regex. Estou procurando por algo que cubra a maioria (espero que tudo) do mundo.

Darryl Hein
fonte
4
Um único regex para todos os códigos postais seria inútil na maioria dos casos, sem mencionar a necessidade de muita codificação unicode. Muito melhor é verificar a regex país a país para que você não valide coisas como "Nova York, NY AF23Q" como corretas.
Sim - esse Jake.
101
Você tem um problema. Você escreve um regex para ele. Agora você tem dois problemas.
Robert S.
regexlib.com/Search.aspx?k=decimal&c=3&m=-1&ps=100 para validar um campo clique aqui
Dinesh Kumar
2
Aquele que lida com todos os possíveis valores futuros.
Jodrell

Respostas:

127

Não há nenhum.

Os códigos postais / postais em todo o mundo não seguem um padrão comum. Em alguns países, eles são compostos por números, em outros, podem ser combinações de números e letras, alguns podem conter espaços, outros pontos, o número de caracteres pode variar de dois a pelo menos seis ...

O que você poderia fazer (teoricamente) é criar um regex separado para todos os países do mundo, IMO não recomendável. Mas você ainda estaria ausente da parte da validação: o código postal 12345pode existir, mas 12346não, talvez 12344também não exista. Como você verifica isso com uma regex?

Você não pode.

Treb
fonte
Suspeito que um regex possa ser compilado, mas que uma tarefa como essa seja muito mais adequada para um banco de dados. O regex seria algo como 10000 | 10001 | 10002 | 10003 | .......
Kibbee
para validar um campo, acesse regexlib.com/Search.aspx?k=decimal&c=3&m=-1&ps=100
Dinesh Kumar
Você pode usar primeiro um regexp que corresponda ao seu país (consulte en.wikipedia.org/wiki/List_of_postal_codes ) e faça uma verificação real por um serviço externo como geonames.org/export/ws-overview.html
SimonSimCity
3
Meus dois centavos: No Brasil é actualy 8 números, 5 seguido por um traço e 3 mais
Jorge Campos
^\d{5}(?:[-\s]\d{4})?$
Aamir Afridi
261

O CLDR unicode contém o código postal regex para cada país. (158 regex no total!)

O Google também possui um serviço da Web com informações de formatação de endereço por país, incluindo códigos postais, aqui - http://i18napis.appspot.com/address (eu encontrei esse link em http://unicode.org/review/pri180/ )

Editar

Aqui uma cópia do postalCodeData.xml regex:

"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}"
Chi
fonte
3
Apenas com uma varredura rápida do código postal da regex da AU ... esse regex é muito simples e permitirá a passagem de muitos falsos positivos, por isso não é exaustivo.
Taryn East
7
A versão mais recente do CLDR unicode que contém o regex do código postal é a versão 26.0.1. Nas versões posteriores, ele foi removido porque os dados não foram mantidos e nenhuma outra fonte confiável foi encontrada.
KIKO Software
1
Mesmo, muito básico para o código postal francês regex. Use este "^ ((0 [1-9]) | ([1-8] [0-9]) | (9 [0-8]) | (2A) | (2B)) [0-9] {3} $ "-> developpez.net/forums/d518232/webmasters-developpement-web/…
Vincent D.
Estou usando o i18napis.appspot.com/address/data/GB agora; há algum problema com este serviço?
mgol 11/07
1
Pequena correção no comentário do @ kiko-software: a versão mais recente que contém dados de código postal é 27.0.3 .
Sietse
89

use estes 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}$"
);
neeraj t
fonte
7
Uma das melhores tentativas que eu já vi para realmente responder ao OP. Seja mais lento à medida que você anuncia mais, mas com uma abordagem limpa e clara.
7263 Rob
3
Não fica mais lento à medida que você adiciona mais, como sugere Rob, pois escolheria uma das expressões regulares do código do país.
Thomaschaaf 26/02
2
Vejo que você postou isso em 2012. Tem mais desde então?
Rybo111
@ rybo111 verifique a resposta do Chi.
Giulio Caccin
5
@ ddunn801, há uma grande diferença entre validar o padrão e autenticar o código postal. Autenticar os códigos é uma ordem de magnitude muito mais difícil, já que (pelo menos nos EUA) os códigos postais são adicionados e descartados regularmente. Em um mundo ideal, você faria uma verificação rápida para validar o padrão antes de enviar para um serviço (por exemplo, USPS) para validar todo o endereço de correspondência (serviços como este são pagos, você detestaria desperdiçar o valor com dados incorretos ) Infelizmente, o mundo está longe de ser o ideal.
JBH
48
  1. Todo sistema de código postal usa apenas AZ e / ou 0-9 e, às vezes, espaço / traço

  2. Nem todos os países usam códigos postais (por exemplo, Irlanda fora de Dublin), mas vamos ignorá-lo aqui.

  3. O formato mais curto de código postal é Serra Leoa, com NN

  4. A mais longa é a Samoa Americana com NNNNN-NNNNNN

  5. Você deve permitir um espaço ou traço.

  6. Não deve começar ou terminar com espaço ou traço

Isso deve cobrir o acima:

(?i)^[a-z0-9][a-z0-9\- ]{0,10}[a-z0-9]$
Neil McGuigan
fonte
8
Essa parece ser a única resposta que fornece uma verificação de sanidade (que provavelmente é o que o OP queria) em vez de uma validação completa de todas as combinações possíveis. Exatamente o que eu queria thx
Lukos
1
@GiulioCaccin H0H0H0 é um código postal canadense válida (que as crianças usam para obter cartas de Canada Post fingindo ser Papai Noel), mas isso não significa que seja um código postal de cliente válido :)
Neil McGuigan
2
FYI, Samoa Americana é pequeno o suficiente para só tem um código postal e é 96799
naterkane
5
Na minha opinião, esta é a única boa resposta. Pode universalmente ser usado como pré-validação no atributo de padrão HTML, por exemplo.
Blackbam 9/11
2
Penso que esta é uma boa resposta para a situação em que se deseja apenas fazer uma verificação de sanidade e não validar com precisão por país. Apenas para ter um pouco de dados mais limpos sem muito esforço - nos casos em que é necessária segurança total, um plug-in / serviço de terceiros pode ser necessário, como outros indicaram.
Yo Ludke
17

Tentar cobrir o mundo inteiro com uma expressão regular não é completamente possível e certamente não é viável ou recomendado.

Para não tocar minha buzina, mas escrevi algumas expressões regulares bastante completas que você pode achar útil.

  • Códigos postais do Canadá

    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}$
  • CEP dos EUA

    ^[0-9]{5}(-[0-9]{4})?$
  • Códigos postais do Reino Unido

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

Não é possível garantir a precisão sem enviar algo para um endereço e avisar a pessoa quando o receber, mas podemos restringir as coisas eliminando casos que consideramos ruins.

Scott
fonte
A versão estendida dos códigos postais do Canadá pode ter algo errado ou ausente, pois indica que o seguinte código postal é inválido: E3G 0A1, embora seja válido.
fsschmitt
Eu validei contra todos os 845.495 códigos postais no Canadá e essa sequência de regex tem algumas correções na validação estendida para oferecer suporte a todos esses códigos postais. Aqui está a nova sequência de caracteres regex para a validação estendida nos códigos postais do Canadá: pastebin.com/vazqFKy4
fsschmitt 25/11/2015
14

Parece uma boa referência, embora não esteja no Regex.

Realmente, a menos que você esteja realmente enviando algo para seus usuários, não acho que valha a pena. E se você estiver enviando, existem ferramentas / serviços de limpeza de endereços nos quais você pode procurar para facilitar o processo.

Tom Ritter
fonte
Além disso, mesmo que seja o código postal correto hoje, pode muito bem mudar no futuro. O USPS está constantemente adicionando novos e dividindo áreas. A única maneira de acompanhar é validar no momento em que você está realmente enviando algo. Algumas cidades até optam por alterar seu próprio código postal por vários motivos.
NotMe
Parece que alguém pegou o artigo do wiki que você postou acima e o enviou
Chris Smith
8

Usamos o seguinte:

Canadá

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

América

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

De outros

Aceitar como está

Gavin Miller
fonte
1
Eu sugiro adicionar um opcional - [0-9] {4} ao dos EUA. Algumas pessoas usam seu ZIP + 4.
David Thornley
4
/ [0-9] {5} (?: - [0-9] {4})? / Permite validar os dois estilos dos EUA ao mesmo tempo.
Chas. Owens
2
@ Chas.Owens adicionando ^ e $ garante que eles não possam digitar mais nada antes ou depois, como "12345aaa" ... / ^ [0-9] {5} (?: - [0-9] {4}) ? $ /
Tim Franklin
7

Dependendo do seu aplicativo, convém implementar a correspondência de regex para os países onde a maioria dos visitantes se origina e nenhuma validação para o restante (aceite qualquer coisa).

mbillard
fonte
6
.* 

O Big Jump esqueceu as quebras de linha, os espaços em branco e os caracteres de controle.

Os códigos postais internacionais são um tipo de problema de parada.

Usuário desconhecido
fonte
6

Observe que esse é um problema bastante difícil, conforme indicado pela resposta aceita. Eu acho que isso não impediu o pessoal do site geonames.org . Eles têm um arquivo, um arquivo de informações do país , que não se encaixa totalmente nessa resposta - aparentemente, o limite é de 30000 caracteres. Existem regexes para cerca de 150 países.

Extraí aqui os bits relevantes para esta pergunta:

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

Espero não ter cometido nenhum erro, meu regex-fu é muito fraco.

nha
fonte
1
Gostaria de salientar que o regex para a França e a Grã-Bretanha não leva em consideração possíveis espaços; Na França, os códigos postais podem ser inseridos com um espaço entre o segundo e o terceiro dígito (ou seja, 75 001 em vez de 75001). Os códigos postais britânicos costumam ser escritos com um espaço (por exemplo, SW1 1AA em vez de SW11AA).
salcoin 22/10/2015
@ salcoin Obrigado pela contribuição, eu não percebi isso (mesmo sendo francês). Parece que a resposta de Chi é melhor nesse sentido.
N /
porque str_ substitua um espaço sem espaço é super taxativo, certo? : p
Robert Pounder
6

Se alguém ainda estiver interessado em validar códigos postais, encontrei uma solução:

Usando Google Geocoding APIpodemos verificar a validade do CEP que possui o código do país e o próprio CEP .

Por exemplo, eu moro na Ucrânia para que eu possa verificar assim: https://maps.googleapis.com/maps/api/geocode/json?components=postal_code:80380|country:UA

Ou usando a API JS: https://developers.google.com/maps/documentation/javascript/geocoding#ComponentFiltering

Onde o 80380CEP é válido para a Ucrânia, na verdade todos (#####) são válidos.

O Google retorna o ZERO_RESULTSstatus se nada for encontrado. Ou OKum resultado, se ambos estiverem corretos.

Espero que isso seja útil.

Romko
fonte
O único problema seria o limite no número de consultas, que, dependendo do site / tamanho, poderiam ser um problema.
Darryl Hein
@DarrylHein, claro, mas isso é agora bastante um grande preço para fazê-lo funcionar =)
Romko
4

Como outros já apontaram, é improvável um regex para governar todos eles. No entanto, você pode criar expressões regulares para quantos países precisar usando as informações de formatação de endereço da Universal Postal Union - uma agência da ONU pouco conhecida.

Por exemplo, aqui estão as regras de formatação de endereço, incluindo código postal, para vários países (formato PDF):

Adam Messinger
fonte
2

O problema será que você provavelmente não tem um bom meio de acompanhar as mudanças nos requisitos de código postal de países do outro lado do mundo e que não compartilha idiomas comuns. A menos que você tenha um orçamento grande o suficiente para acompanhar isso, é quase certamente melhor dar a responsabilidade de validar endereços para o google ou yahoo.

Ambas as empresas fornecem recursos de pesquisa de endereço por meio de uma API programável.

SingleNegationElimination
fonte
1

Por que você está fazendo isso e por que você se importa? Como Tom Ritter apontou, não importa se você tem um código postal, muito menos se é válido ou não, até e a menos que você esteja realmente enviando algo para esse endereço. Mesmo que você espere enviar algo a eles algum dia , isso não significa que você precise de um código postal hoje .

Dave Sherohman
fonte
Sim, mas se eles entrarem em um, é melhor garantir que estejam corretos nesse ponto. No entanto, concordo com uma das outras respostas que basicamente dizem: faça a validação para os países que você acha que serão a maioria dos seus clientes.
Cdmckay
1
Algumas agências de compensação de crédito não aceitarão uma fatura, a menos que o CEP esteja correto. Prefiro validar o zip na entrada, em vez de enviar a cobrança e rejeitá-la.
SamGoody
1

Como observado em outros lugares, a variação no mundo é enorme. E mesmo que algo que corresponda ao padrão não signifique que ele exista.

Então, é claro, existem muitos lugares onde os códigos postais não são usados ​​(por exemplo, muitos ou a Irlanda).

Richard
fonte
Na verdade, provavelmente toda a Irlanda, como eu não acho D1, D2, etc., são considerados códigos postais adequados, pois você não pode identificar um endereço usando apenas esse código e um número de rua.
Donal
1

Além do envio, há motivos para ter um código postal preciso. As agências de viagens que fazem passeios que atravessam fronteiras (exceto a zona do euro, é claro) precisam dessas informações com antecedência para serem entregues às autoridades. Frequentemente, essas informações são inseridas por um agente que pode ou não estar familiarizado com essas coisas. QUALQUER método que possa reduzir os erros é uma Boa Idéia ™

No entanto, escrever uma regex que cubra todos os códigos postais do mundo seria insano.


fonte
1
É apenas uma boa idéia até que o código comece a rejeitar códigos postais válidos, porque é incorreto ou os códigos postais foram alterados. A validação é algo que deve estar certo ou não estar presente. No mínimo, deve haver uma opção de substituição.
Chas. Owens
1

Dado que existem tantos casos extremos para cada país (por exemplo, os endereços de Londres podem usar um formato ligeiramente diferente do resto do Reino Unido), não acho que exista uma regex definitiva além de talvez:

[0-9a-zA-Z]+

O melhor é seguir um padrão bastante amplo (não tão amplo quanto o acima), ou tratar cada país / região com um padrão específico!

ATUALIZAR: No entanto, pode ser possível construir dinamicamente um regex com base em muitas regras menores e específicas da região - embora não tenha certeza sobre o desempenho!

Muitos padrões específicos de cada país podem ser encontrados no site RegExLib .

BigJump
fonte
1

Alguém estava perguntando sobre a lista de endereços de formatação, e acho que era isso que ele estava procurando ...

O Guia Compulsivo de Frank para Endereços Postais: http://www.columbia.edu/~fdc/postal/ No entanto, não ajuda muito nos problemas das ruas.

Meu trabalho usa algumas ferramentas para ajudá-lo: - Serviços Lexis-Nexis, incluindo pesquisas NCOA (você obterá padronização de endereço "gratuitamente") - "Melissa Data" http://www.melissadata.com

user1390375
fonte
1

Este é um RegEx muito simples para validar o CEP dos EUA (não o ZipCode Plus Four):

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

Parece que todos os cinco dígitos numéricos são códigos postais válidos 00000, exceto , 88888& 99999.

Eu testei este RegEx com http://regexpal.com/

SP

Som Poddar
fonte
Este RegEx não impõe quatro dígitos para a parte zip + 4. Por exemplo, considera "92122-1" um código postal válido.
Sensei James
0

Se Zip Codepermitir caracteres e dígitos (alfanuméricos), abaixo de regex seria usado onde corresponder, 5, 9 ou 10 caracteres alfanuméricos com um hífen ( -):

^([0-9A-Za-z]{5}|[0-9A-Za-z]{9}|(([0-9a-zA-Z]{5}-){1}[0-9a-zA-Z]{4}))$
Vivek Kalekere
fonte