¿Cuál es el código postal y el código postal definitivo?


201

Estoy buscando el último código postal y código postal regex. Estoy buscando algo que cubra la mayoría (con suerte, todo) del mundo.


44
Una única expresión regular para todos los códigos postales sería inútil para la mayoría de los casos, sin mencionar que requiere una gran cantidad de codificación Unicode. Mucho mejor es verificar la expresión regular país por país para no validar cosas como "Nueva York, NY AF23Q" como correctas.
Sí, ese Jake.

101
Tienes un problema. Escribes una expresión regular para ello. Ahora tienes dos problemas.
Robert S.


2
El que maneja todos los posibles valores futuros.
Jodrell

Respuestas:


127

No hay ninguno.

Los códigos postales / postales de todo el mundo no siguen un patrón común. En algunos países están formados por números, en otros pueden ser combinaciones de números y letras, algunos pueden contener espacios, otros puntos, el número de caracteres puede variar de dos a al menos seis ...

Lo que podría hacer (en teoría) es crear una expresión regular separada para todos los países del mundo, no es recomendable la OMI. Pero aún faltaría en la parte de validación: el código postal 12345puede existir, pero 12346no, tal vez 12344tampoco exista. ¿Cómo se verifica eso con una expresión regular?

No puedes


Sospecho que se puede compilar una expresión regular, pero que una tarea como esta se adapte mucho mejor a una base de datos. La expresión regular se vería algo así como 10000 | 10001 | 10002 | 10003 | .......
Kibbee


Puede usar primero una expresión regular que coincida con su país (ver en.wikipedia.org/wiki/List_of_postal_codes ) y hacer una verificación real por un servicio externo como geonames.org/export/ws-overview.html
SimonSimCity

3
Mis dos centavos: en Brasil son actualmente 8 números, 5 seguidos de una raya y 3 más
Jorge Campos

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

261

El CLDR unicode contiene el código postal regex para cada país. (¡158 expresiones regulares en total!)

Google también tiene un servicio web con información de formato de dirección por país, incluidos los códigos postales, aquí: http://i18napis.appspot.com/address (encontré ese enlace a través de http://unicode.org/review/pri180/ )

Editar

Aquí una copia de la expresión regular 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
Solo con un escaneo rápido del código postal AU-regex ... esta expresión regular es muy simple y permitirá muchos falsos positivos, por lo que no es exhaustiva.
Taryn East

77
La última versión de CLDR unicode que contiene el código postal regex es la versión 26.0.1. En versiones posteriores se ha eliminado porque los datos no se mantuvieron y no se pudieron encontrar otras fuentes confiables.
KIKO Software

1
Igual, muy básico para el 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.

Estoy usando i18napis.appspot.com/address/data/GB ahora; ¿Hay algún problema con este servicio?
mgol

1
Pequeña corrección al comentario de @kiko-software: la última versión que contiene datos del código postal es 27.0.3 .
Sietse

89

usa estos 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}$"
);

77
Uno de los mejores intentos que he visto para responder realmente al OP. Es más lento a medida que publicita más, pero un enfoque limpio y claro.
Rob

3
No se vuelve más lento a medida que agrega más, como sugiere Rob, ya que elegiría una de las expresiones regulares del código de país.
Thomaschaaf

2
Veo que publicaste esto en 2012. ¿Tienes más desde entonces?
rybo111

@ rybo111 verifica la respuesta de Chi.
Giulio Caccin

55
@ ddunn801, hay una gran diferencia entre validar el patrón y autenticar el código postal. Autenticar los códigos es mucho más difícil ya que (al menos en los EE. UU.) Los códigos postales se agregan y se eliminan regularmente. En un mundo ideal, realizaría una verificación rápida para validar el patrón antes de enviarlo a un servicio (por ejemplo, USPS) para validar la dirección postal completa (servicios como este son pagados, odiaría desperdiciar el valor con datos incorrectos ) Por desgracia, el mundo está lejos de ser ideal.
JBH

48
  1. Cada sistema de código postal usa solo AZ y / o 0-9 y, a veces, espacio / guión

  2. No todos los países usan códigos postales (por ejemplo, Irlanda fuera de Dublín), pero lo ignoraremos aquí.

  3. El formato de código postal más corto es Sierra Leona con NN

  4. El más largo es Samoa Americana con NNNNN-NNNNNN

  5. Debe permitir un espacio o guión.

  6. No debe comenzar o terminar con espacio o guión

Esto debería cubrir lo anterior:

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

8
Esta parece ser la única respuesta que proporciona un control de cordura (que es probablemente lo que quería el OP) en lugar de una validación completa de cada combinación posible. Exactamente lo que quería gracias
Lukos

1
@GiulioCaccin H0H0H0 es un código postal canadiense válido (que los niños usan para recibir cartas de Canada Post que fingen ser Santa Claus), pero eso no significa que sea un código postal válido del cliente :)
Neil McGuigan

2
Para su información, Samoa Americana es lo suficientemente pequeña como para tener solo un código postal y es 96799
naterkane

55
En mi opinión, esta es la única buena respuesta. Se puede usar universalmente como validación previa en el atributo de patrón HTML, por ejemplo.
Blackbam

2
Creo que esta es una buena respuesta para la situación en la que uno solo quiere tener un control de cordura y no validar con precisión por país. Solo para tener un poco de datos más limpios sin mucho esfuerzo: en los casos en que se necesita total seguridad, se podría necesitar un complemento / servicio de terceros como otros señalaron.
Yo Ludke

17

Intentar cubrir el mundo entero con una expresión regular no es completamente posible, y ciertamente no es factible o recomendado.

No para sonar mi propia bocina, pero he escrito algunas expresiones regulares bastante completas que pueden serle útiles.

  • Códigos postales canadienses

    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}$
  • Códigos postales de EE. UU.

    ^[0-9]{5}(-[0-9]{4})?$
  • Códigos postales del 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))$

No es posible garantizar la precisión sin enviar realmente algo a una dirección y que la persona le avise cuando lo reciba, pero podemos reducir las cosas eliminando los casos que sabemos que son malos.


La versión extendida para los códigos postales canadienses puede tener algo incorrecto o faltante, ya que dice que el siguiente código postal no es válido: E3G 0A1, aunque es válido.
fsschmitt

He validado contra todos los 845,495 códigos postales en Canadá y esta cadena de expresiones regulares tiene algunas correcciones en la validación extendida para admitir todos estos códigos postales. Aquí está la nueva cadena de expresiones regulares para la validación extendida en los códigos postales canadienses: pastebin.com/vazqFKy4
fsschmitt

14

Esto parece una buena referencia, aunque no está en Regex.

Realmente, a menos que esté enviando algo a sus usuarios, no creo que valga la pena el esfuerzo. Y si lo está enviando, existen herramientas / servicios de limpieza de direcciones que puede considerar para que sea más fácil para usted.


Además, incluso si hoy es el código postal correcto, muy bien podría cambiar en el futuro. USPS agrega constantemente nuevos y divide áreas. La única forma en que puede mantenerse al día es validar en el momento en que realmente envía algo. Algunas ciudades incluso eligen cambiar su propio código postal por una variedad de razones.
NotMe

Parece que alguien tomó el artículo wiki que publicó arriba y lo envió a JSON con la expresión regular de código postal / postal para cada país - gist.github.com/matthewbednarski/…
Chris Smith

8

Usamos lo siguiente:

Canadá

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

America

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

Otro

Aceptar como es


1
Sugeriría agregar un opcional - [0-9] {4} al de EE. UU. Algunas personas usan su ZIP + 4.
David Thornley

44
/ [0-9] {5} (?: - [0-9] {4})? / Le permite validar ambos estilos de los Estados Unidos al mismo tiempo.
Chas. Owens

2
@ Chas.Owens agregando ^ y $ aseguran que no pueden escribir nada más antes o después, como "12345aaa" ... / ^ [0-9] {5} (?: - [0-9] {4}) ? $ /
Tim Franklin

7

Dependiendo de su aplicación, es posible que desee implementar la coincidencia de expresiones regulares para los países donde se originan la mayoría de sus visitantes y no validar el resto (acepte cualquier cosa).


6
.* 

Big Jump se olvidó de los saltos de línea, los espacios en blanco y los caracteres de control.

Los códigos postales internacionales son una especie de problema de detención.


6

Tenga en cuenta que este es un problema bastante difícil, como lo indica la respuesta aceptada. Sin embargo, supongo que no disuadió a la gente de geonames.org . Tienen un archivo un archivo de información del país , que no encaja completamente en esta respuesta: el límite es aparentemente de 30000 caracteres. Hay expresiones regulares para unos 150 países.

Extraje los bits relevantes para esta pregunta aquí:

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 no haber cometido ningún error, mi regex-fu es bastante débil.


1
Me gustaría señalar que la expresión regular para Francia y Gran Bretaña no tiene en cuenta los espacios posibles; En Francia, los códigos postales pueden ingresarse con un espacio entre el segundo y el tercer dígito (es decir, 75 001 en lugar de 75001). Los códigos postales británicos a menudo se escriben con un espacio (es decir, SW1 1AA en lugar de SW11AA).
salcoin

@salcoin Gracias por el aporte, no lo noté (aunque soy francés). Parece que la respuesta de Chi es mejor en este sentido.
nha

porque str_replace un espacio sin espacio es supergrasivo ¿verdad? : p
Robert Pounder

6

Si alguien todavía está interesado en cómo validar los códigos postales, he encontrado una solución:

Utilizando Google Geocoding APIpodemos verificar la validez del código postal que tiene tanto el código de país como el código postal en sí.

Por ejemplo, vivo en Ucrania, por lo que puedo verificar así: https://maps.googleapis.com/maps/api/geocode/json?components=postal_code:80380|country:UA

O utilizando la API de JS: https://developers.google.com/maps/documentation/javascript/geocoding#ComponentFiltering

Donde 80380es válido ZIP para Ucrania, en realidad cada (#####) es válido.

Google devuelve el ZERO_RESULTSestado si no se encuentra nada. O OKy un resultado si ambos son correctos.

Esperamos que esto sea útil.


El único problema sería el límite en el número de consultas, que, dependiendo del sitio / tamaño, podría ser un problema.
Darryl Hein

@DarrylHein, por supuesto, pero ahora es un precio bastante alto para que funcione =)
Romko

4

Como otros han señalado, una expresión regular para gobernarlos a todos es poco probable. Sin embargo, puede crear expresiones regulares para tantos países como necesite utilizando el información de formato de dirección de la Unión Postal Universal , una agencia poco conocida de la ONU.

Por ejemplo, aquí están las reglas de formato de dirección, incluido el código postal, para un puñado de países (formato PDF):


2

El problema será que probablemente no tenga un buen medio para mantenerse al día con los requisitos cambiantes del código postal de los países del otro lado del mundo y que no comparte idiomas comunes. A menos que tenga un presupuesto lo suficientemente grande como para rastrear esto, es casi seguro que le otorgue la responsabilidad de validar las direcciones a google o yahoo.

Ambas compañías proporcionan facilidades de búsqueda de direcciones a través de una API programable.


1

¿Por qué haces esto y por qué te importa? Como señaló Tom Ritter, no importa si tiene un código postal / postal, mucho menos si es válido o no, hasta y a menos que realmente envíe algo a esa dirección. Incluso si espera que algún día les envíe algo , eso no significa que necesite un código postal hoy .


Sí, pero si van a ingresar uno, también deberían asegurarse de que sea correcto en ese punto. Sin embargo, estoy de acuerdo con una de las otras respuestas que básicamente dice: valide para los países que cree que serán la mayoría de sus clientes.
cdmckay

1
Algunas cámaras de compensación de crédito no aceptarán una factura a menos que el código postal sea correcto. Prefiero validar la entrada zip en lugar de enviar el cargo y rechazarlo.
SamGoody

1

Como se señaló en otra parte, la variación en todo el mundo es enorme. E incluso si algo que coincide con el patrón no significa que existe.

Luego, por supuesto, hay muchos lugares donde no se utilizan códigos postales (por ejemplo, mucho o Irlanda).


En realidad, probablemente toda Irlanda, ya que no creo que D1, D2, etc. se consideren códigos postales adecuados, ya que no puede identificar una dirección utilizando solo este código y un número de calle.
Dónal

1

Hay razones más allá del envío para tener un código postal exacto. Las agencias de viajes que realizan recorridos que cruzan fronteras (excepto la Eurozona, por supuesto) necesitan esta información con anticipación para dar a las autoridades. A menudo, esta información es ingresada por un agente que puede o no estar familiarizado con tales cosas. CUALQUIER método que pueda reducir los errores es una buena idea ™

Sin embargo, escribir una expresión regular que cubra todos los códigos postales del mundo sería una locura.


1
Es una buena idea hasta que el código comience a rechazar códigos postales válidos, ya sea porque está defectuoso o porque los códigos postales han cambiado. La validación es algo que debe ser correcto o no estar allí. Como mínimo, debería haber una opción de anulación.
Chas. Owens

1

Dado que hay tantos casos extremos para cada país (por ejemplo, las direcciones de Londres pueden usar un formato ligeramente diferente al resto del Reino Unido), no creo que haya una expresión regular definitiva aparte de tal vez:

[0-9a-zA-Z]+

Lo mejor es seguir un patrón bastante amplio (bueno, no tan amplio como el anterior), ¡o tratar a cada país / región con un patrón específico propio!

ACTUALIZAR: Sin embargo, puede ser posible construir dinámicamente una expresión regular basada en muchas reglas más pequeñas, específicas de la región, ¡aunque no estoy seguro sobre el rendimiento!

Se pueden encontrar muchos patrones específicos del país en el sitio RegExLib .


1

Alguien estaba preguntando sobre la lista de direcciones de correo de formato, y creo que esto es lo que estaba buscando ...

Guía compulsiva de Frank de direcciones postales: http://www.columbia.edu/~fdc/postal/ Sin embargo, No ayuda mucho con los problemas a nivel de la calle.

Mi trabajo utiliza un par de herramientas para ayudar con esto: - Servicios de Lexis-Nexis, incluidas las búsquedas de NCOA (obtendrá la estandarización de direcciones de forma "gratuita") - "Melissa Data" http://www.melissadata.com


1

Este es un RegEx muy simple para validar el código postal de EE. UU. (No ZipCode Plus Four):

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

Parece que los cinco dígitos numéricos son códigos postales válidos 00000, excepto , 88888& 99999.

He probado este RegEx con http://regexpal.com/

SP


Este RegEx no aplica cuatro dígitos para la porción zip + 4. Por ejemplo, considera "92122-1" un código postal válido.
Sensei James

0

Si Zip Codepermite caracteres y dígitos (alfanuméricos), la expresión regular debajo se usaría donde coincida, 5 o 9 o 10 caracteres alfanuméricos con una letra ( -):

^([0-9A-Za-z]{5}|[0-9A-Za-z]{9}|(([0-9a-zA-Z]{5}-){1}[0-9a-zA-Z]{4}))$
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.