regular - UK Postcode Regex(Completo)
regular expressions html5 (28)
Estoy buscando una expresión regular que valide un código postal completo de UK solo dentro de una cadena de entrada. Todos los formularios de código postal poco comunes deben ser cubiertos tan bien como los habituales. Por ejemplo:
Partidos
- CW3 9SS
- SE5 0EG
- SE50EG
- se5 0eg
- WC2H 7LT
Sin coincidencia
- aWC2H 7LT
- WC2H 7LTa
- WC2H
¿Hay expresiones regulares oficiales o incluso semioficiales en uso para este tipo de cosas? ¿Algún otro consejo sobre cómo formatear y almacenar estos en una base de datos?
Algunas de las expresiones regulares anteriores son un poco restrictivas. Tenga en cuenta que el código postal genuino: "W1K 7AA" fallaría dado que la regla "Posición 3 - AEHMNPRTVXY solo se utilizaba" arriba ya que "K" no se permitiría.
la expresión regular:
^(GIR 0AA|[A-PR-UWYZ]([0-9]{1,2}|([A-HK-Y][0-9]|[A-HK-Y][0-9]([0-9]|[ABEHMNPRV-Y]))|[0-9][A-HJKPS-UW])[0-9][ABD-HJLNP-UW-Z]{2})$
Parece un poco más preciso, ver el artículo de Wikipedia titulado ''Códigos postales en el Reino Unido'' .
Tenga en cuenta que esta expresión regular requiere mayúsculas solo caracteres.
La pregunta más importante es si está restringiendo la entrada del usuario para permitir solo los códigos postales que realmente existen o si simplemente está tratando de evitar que los usuarios ingresen basura completa en los campos del formulario. Corregir correctamente todos los códigos postales posibles y probarlos en el futuro es un acertijo más difícil, y probablemente no valga la pena a menos que seas HMRC.
Aquí hay una expresión regular basada en el formato especificado en los documentos que están vinculados a la respuesta de marcj:
/^[A-Z]{1,2}[0-9][0-9A-Z]? ?[0-9][A-Z]{2}$/
La única diferencia entre eso y las especificaciones es que los últimos 2 caracteres no pueden estar en [CIKMOV] de acuerdo con las especificaciones.
Editar: Aquí hay otra versión que prueba las limitaciones del carácter final.
/^[A-Z]{1,2}[0-9][0-9A-Z]? ?[0-9][A-BD-HJLNP-UW-Z]{2}$/
De acuerdo con esta tabla de Wikipedia
Este patrón cubre todos los casos
(?:[A-Za-z]/d ?/d[A-Za-z]{2})|(?:[A-Za-z][A-Za-z/d]/d ?/d[A-Za-z]{2})|(?:[A-Za-z]{2}/d{2} ?/d[A-Za-z]{2})|(?:[A-Za-z]/d[A-Za-z] ?/d[A-Za-z]{2})|(?:[A-Za-z]{2}/d[A-Za-z] ?/d[A-Za-z]{2})
Al usarlo en Android / Java use // d
Eché un vistazo a algunas de las respuestas anteriores y recomendaría no utilizar el patrón de la respuesta de @ Dan (c. 15 de diciembre de 2010 ) , ya que indica incorrectamente casi el 0,4% de los códigos postales válidos como no válidos, mientras que los otros no .
Ordnance Survey proporciona un servicio llamado Code Point Open que:
contiene una lista de todas las unidades actuales de código postal en Gran Bretaña
Ejecuté cada una de las expresiones regulares anteriores en la lista completa de códigos postales (6 de julio de 2013) a partir de estos datos usando grep
:
cat CSV/*.csv |
# Strip leading quotes
sed -e ''s/^"//g'' |
# Strip trailing quote and everything after it
sed -e ''s/".*//g'' |
# Strip any spaces
sed -E -e ''s/ +//g'' |
# Find any lines that do not match the expression
grep --invert-match --perl-regexp "$pattern"
Hay 1,686,202 códigos postales en total.
Los siguientes son los números de códigos postales válidos que no coinciden con cada $pattern
:
''^([A-PR-UWYZ0-9][A-HK-Y0-9][AEHMNPRTVXY0-9]?[ABEHMNPRVWXY0-9]?[0-9][ABD-HJLN-UW-Z]{2}|GIR 0AA)$''
# => 6016 (0.36%)
''^(GIR ?0AA|[A-PR-UWYZ]([0-9]{1,2}|([A-HK-Y][0-9]([0-9ABEHMNPRV-Y])?)|[0-9][A-HJKPS-UW]) ?[0-9][ABD-HJLNP-UW-Z]{2})$''
# => 0
''^GIR[ ]?0AA|((AB|AL|B|BA|BB|BD|BH|BL|BN|BR|BS|BT|BX|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}$''
# => 0
Por supuesto, estos resultados solo se ocupan de los códigos postales válidos que se marcan incorrectamente como no válidos. Asi que:
''^.*$''
# => 0
No digo nada sobre qué patrón es el mejor para filtrar los códigos postales no válidos.
Eche un vistazo al código python en esta página:
http://www.brunningonline.net/simon/blog/archives/001292.html
Tengo que analizar algunos códigos postales. El requisito es bastante simple; Tengo que analizar un código postal en un outcode y (opcional) incode. Lo bueno es que no tengo que realizar ninguna validación, solo tengo que cortar lo que me han proporcionado de una manera vagamente inteligente. No puedo asumir mucho sobre mi importación en términos de formato, es decir, el caso y los espacios integrados. Pero esta no es la mala noticia; la mala noticia es que tengo que hacerlo todo en RPG. :-(
Sin embargo, lancé una pequeña función de Python para aclarar mi pensamiento.
Lo he usado para procesar los códigos postales para mí.
Esta es la expresión regular que Google i18napis.appspot.com en su dominio i18napis.appspot.com :
GIR[ ]?0AA|((AB|AL|B|BA|BB|BD|BH|BL|BN|BR|BS|BT|BX|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}
Este permite espacios vacíos y pestañas de ambos lados en caso de que no quiera fallar la validación y luego recortarlo del lado del servidor.
^/s*(([Gg][Ii][Rr] 0[Aa]{2})|((([A-Za-z][0-9]{1,2})|(([A-Za-z][A-Ha-hJ-Yj-y][0-9]{1,2})|(([A-Za-z][0-9][A-Za-z])|([A-Za-z][A-Ha-hJ-Yj-y][0-9]?[A-Za-z])))) {0,1}[0-9][A-Za-z]{2})/s*$)
He estado buscando una expresión regular de código postal del Reino Unido durante el último día y tropecé con este hilo. Trabajé para la mayoría de las sugerencias anteriores y ninguna de ellas me funcionó, así que ideé mi propia expresión regular que, hasta donde sé, captura todos los códigos postales válidos del Reino Unido a partir de enero de 2013 (según la última literatura de el Correo Real).
La expresión regular y algunos códigos postales simples que verifican el código PHP se publican a continuación. NOTA: - Permite códigos postales más bajos o mayúsculos y la anomalía GIR 0AA, pero para tratar con la presencia, más que probable, de un espacio en el medio de un código postal introducido, también hace uso de un str_replace simple para eliminar el espacio antes de la prueba contra la expresión regular. Cualquier discrepancia más allá de eso y el Royal Mail ni siquiera los menciona en su literatura (ver http://www.royalmail.com/sites/default/files/docs/pdf/programmers_guide_edition_7_v5.pdf y comienza a leer en la página 17) !
Nota: En la propia literatura del Royal Mail (enlace arriba) existe una leve ambigüedad en torno a la tercera y cuarta posiciones y las excepciones vigentes si estos caracteres son letras. Me puse en contacto con Royal Mail directamente para aclararlo y con sus propias palabras: "Una carta en la 4ª posición del Código de salida con el formato AANA NAA no tiene excepciones y las excepciones de la 3ª posición se aplican solo a la última letra del Código de salida con el formato ANA NAA ". ¡Directo de la boca del caballo!
<?php
$postcoderegex = ''/^([g][i][r][0][a][a])$|^((([a-pr-uwyz]{1}([0]|[1-9]/d?))|([a-pr-uwyz]{1}[a-hk-y]{1}([0]|[1-9]/d?))|([a-pr-uwyz]{1}[1-9][a-hjkps-uw]{1})|([a-pr-uwyz]{1}[a-hk-y]{1}[1-9][a-z]{1}))(/d[abd-hjlnp-uw-z]{2})?)$/i'';
$postcode2check = str_replace('' '','''',$postcode2check);
if (preg_match($postcoderegex, $postcode2check)) {
echo "$postcode2check is a valid postcode<br>";
} else {
echo "$postcode2check is not a valid postcode<br>";
}
?>
Espero que ayude a cualquier otra persona que encuentre este hilo en busca de una solución.
La mayoría de las respuestas aquí no funcionaron para todos los códigos postales que tengo en mi base de datos. Finalmente encontré uno que valida con todos, usando la nueva expresión regular proporcionada por el gobierno:
No está en ninguna de las respuestas anteriores, así que lo publico aquí en caso de que eliminen el enlace:
^([Gg][Ii][Rr] 0[Aa]{2})|((([A-Za-z][0-9]{1,2})|(([A-Za-z][A-Ha-hJ-Yj-y][0-9]{1,2})|(([A-Za-z][0-9][A-Za-z])|([A-Za-z][A-Ha-hJ-Yj-y][0-9]?[A-Za-z])))) [0-9][A-Za-z]{2})$
ACTUALIZACIÓN: regex actualizada según lo señaló Jamie Bull. No estoy seguro si fue un error al copiar o si fue un error en la expresión regular del gobierno, ahora el enlace está inactivo ...
La respuesta aceptada refleja las reglas dadas por Royal Mail, aunque hay un error ortográfico en la expresión regular. Este error parece haber estado allí también en el sitio de gov.uk (como está en la página de archivo XML).
En el formato A9A 9AA, las reglas permiten un carácter P en la tercera posición, mientras que la expresión regular no permite esto. The correct regex would be:
(GIR 0AA)|((([A-Z-[QVX]][0-9][0-9]?)|(([A-Z-[QVX]][A-Z-[IJZ]][0-9][0-9]?)|(([A-Z-[QVX]][0-9][A-HJKPSTUW])|([A-Z-[QVX]][A-Z-[IJZ]][0-9][ABEHMNPRVWXY])))) [0-9][A-Z-[CIKMOV]]{2})
Shortening this results in the following regex (which uses Perl/Ruby syntax):
(GIR 0AA)|([A-PR-UWYZ](([0-9]([0-9A-HJKPSTUW])?)|([A-HK-Y][0-9]([0-9ABEHMNPRVWXY])?))/s?[0-9][ABD-HJLNP-UW-Z]{2})
It also includes an optional space between the first and second block.
Los códigos postales están sujetos a cambios, y la única forma verdadera de validar un código postal es tener la lista completa de códigos postales y ver si están allí.
Pero las expresiones regulares son útiles porque:
- son fáciles de usar e implementar
- son cortos
- son rápidos de ejecutar
- son bastante fáciles de mantener (en comparación con una lista completa de códigos postales)
- Todavía captura la mayoría de los errores de entrada
Pero las expresiones regulares tienden a ser difíciles de mantener, especialmente para alguien que no se le ocurrió en primer lugar. Entonces debe ser:
- tan fácil de entender como sea posible
- relativamente a prueba de futuro
Eso significa que la mayoría de las expresiones regulares en esta respuesta no son lo suficientemente buenas. Por ejemplo, puedo ver que [A-PR-UWYZ][A-HK-Y][0-9][ABEHMNPRV-Y]
va a coincidir con un área de código postal de la forma AA1A, pero va a ser un dolor en el cuello si y cuando se agrega un nuevo área de código postal, porque es difícil entender qué áreas de código postal coincide.
También quiero que mi expresión regular coincida con la primera y la segunda mitad del código postal como coincidencias entre paréntesis.
Así que se me ocurrió esto:
(GIR(?=/s*0AA)|(?:[BEGLMNSW]|[A-Z]{2})[0-9](?:[0-9]|(?<=N1|E1|SE1|SW1|W1|NW1|EC[0-9]|WC[0-9])[A-HJ-NP-Z])?)/s*([0-9][ABD-HJLNP-UW-Z]{2})
En formato PCRE, se puede escribir de la siguiente manera:
/^
( GIR(?=/s*0AA) # Match the special postcode "GIR 0AA"
|
(?:
[BEGLMNSW] | # There are 8 single-letter postcode areas
[A-Z]{2} # All other postcode areas have two letters
)
[0-9] # There is always at least one number after the postcode area
(?:
[0-9] # And an optional extra number
|
# Only certain postcode areas can have an extra letter after the number
(?<=N1|E1|SE1|SW1|W1|NW1|EC[0-9]|WC[0-9])
[A-HJ-NP-Z] # Possible letters here may change, but [IO] will never be used
)?
)
/s*
([0-9][ABD-HJLNP-UW-Z]{2}) # The last two letters cannot be [CIKMOV]
$/x
Para mí, este es el equilibrio correcto entre la validación tanto como sea posible y, al mismo tiempo, a prueba de futuro y que permita un mantenimiento sencillo.
No existe una expresión regular completa del código postal del Reino Unido que sea capaz de validar un código postal. Puede verificar que un código postal esté en el formato correcto usando una expresión regular; no es que realmente exista.
Los códigos postales son arbitrariamente complejos y cambian constantemente. Por ejemplo, el código de salida W1
no tiene, y puede que nunca tenga, cada número entre 1 y 99, para cada área de código postal.
No puede esperar que lo que hay actualmente sea cierto para siempre. Como ejemplo, en 1990, la Oficina de Correos decidió que Aberdeen estaba un poco abarrotada. Agregaron un 0 al final de AB1-5 por lo que es AB10-50 y luego crearon una serie de códigos postales entre estos.
Cada vez que se construye una nueva calle, se crea un nuevo código postal. Es parte del proceso para obtener permiso para construir; las autoridades locales están obligadas a mantener esto actualizado con la Oficina de Correos (no es que todos lo hagan).
Además, como notaron otros usuarios, están los códigos postales especiales, como Girobank, GIR 0AA, y el de las cartas a Santa, SAN TA1, probablemente no quieras publicar nada allí, pero no parece estar cubierto por cualquier otra respuesta.
Luego, están los códigos postales de BFPO, que ahora están cambiando a un formato más estándar . Ambos formatos van a ser válidos. Por último, está la fuente de los territorios de ultramar Wikipedia .
+----------+----------------------------------------------+ | Postcode | Location | +----------+----------------------------------------------+ | AI-2640 | Anguilla | | ASCN 1ZZ | Ascension Island | | STHL 1ZZ | Saint Helena | | TDCU 1ZZ | Tristan da Cunha | | BBND 1ZZ | British Indian Ocean Territory | | BIQQ 1ZZ | British Antarctic Territory | | FIQQ 1ZZ | Falkland Islands | | GX11 1AA | Gibraltar | | PCRN 1ZZ | Pitcairn Islands | | SIQQ 1ZZ | South Georgia and the South Sandwich Islands | | TKCA 1ZZ | Turks and Caicos Islands | +----------+----------------------------------------------+
Luego, debe tener en cuenta que el Reino Unido "exportó" su sistema de código postal a muchos lugares del mundo. Cualquier cosa que valide un código postal "UK" también validará los códigos postales de varios otros países.
Si desea validar un código postal del Reino Unido, la forma más segura de hacerlo es utilizar una búsqueda de los códigos postales actuales. Hay muchas opciones:
Ordnance Survey lanza Code-Point Open bajo una licencia de datos abiertos. Estará un poco retrasado pero es gratis. Esto (probablemente, no recuerdo) no incluirá los datos de Irlanda del Norte, ya que la Encuesta de Artillería no tiene ninguna competencia allí. El mapeo en Irlanda del Norte se lleva a cabo por el Ordnance Survey de Irlanda del Norte y tienen su producto Pointer separado, pagado. Puede usar esto y anexar los pocos que no están cubiertos con bastante facilidad.
Royal Mail publica el archivo de dirección de código postal (PAF) , esto incluye BFPO, que no estoy seguro de que Code-Point Open sí. Se actualiza regularmente pero cuesta dinero (y pueden ser francamente malos al respecto a veces). PAF incluye la dirección completa en lugar de solo los códigos postales y viene con su propia Guía de programadores . El Grupo de Usuarios de Datos Abiertos (ODUG, por sus siglas en inglés) actualmente está presionando para que se libere el PAF de forma gratuita, aquí hay una descripción de su posición .
Por último, hay AddressBase . Esta es una colaboración entre Ordnance Survey, Autoridades Locales, Royal Mail y una compañía que combina para crear un directorio definitivo de toda la información sobre todas las direcciones del Reino Unido (también han sido bastante exitosas). Se paga, pero si trabaja con una autoridad local, un departamento gubernamental o un servicio del gobierno, es gratis para ellos. Hay mucha más información que solo los códigos postales incluidos.
Nos dieron una especificación:
UK postcodes must be in one of the following forms (with one exception, see below): § A9 9AA § A99 9AA § AA9 9AA § AA99 9AA § A9A 9AA § AA9A 9AA where A represents an alphabetic character and 9 represents a numeric character. Additional rules apply to alphabetic characters, as follows: § The character in position 1 may not be Q, V or X § The character in position 2 may not be I, J or Z § The character in position 3 may not be I, L, M, N, O, P, Q, R, V, X, Y or Z § The character in position 4 may not be C, D, F, G, I, J, K, L, O, Q, S, T, U or Z § The characters in the rightmost two positions may not be C, I, K, M, O or V The one exception that does not follow these general rules is the postcode "GIR 0AA", which is a special valid postcode.
Se nos ocurrió esto:
/^([A-PR-UWYZ][A-HK-Y0-9](?:[A-HJKS-UW0-9][ABEHMNPRV-Y0-9]?)?/s*[0-9][ABD-HJLNP-UW-Z]{2}|GIR/s*0AA)$/i
Pero tenga en cuenta que esto permite cualquier cantidad de espacios entre grupos.
Para agregar a esta lista una expresión regular más práctica que uso que permite al usuario ingresar una empty string
es:
^$|^(([gG][iI][rR] {0,}0[aA]{2})|((([a-pr-uwyzA-PR-UWYZ][a-hk-yA-HK-Y]?[0-9][0-9]?)|(([a-pr-uwyzA-PR-UWYZ][0-9][a-hjkstuwA-HJKSTUW])|([a-pr-uwyzA-PR-UWYZ][a-hk-yA-HK-Y][0-9][abehmnprv-yABEHMNPRV-Y]))) {0,1}[0-9][abd-hjlnp-uw-zABD-HJLNP-UW-Z]{2}))$
Esta expresión regular permite mayúsculas y minúsculas con un espacio opcional entre ellas
Desde el punto de vista de los desarrolladores de software, esta expresión regular es útil para el software donde una dirección puede ser opcional. Por ejemplo, si un usuario no desea proporcionar los detalles de su dirección
Para verificar que un código postal esté en un formato válido según http://www.royalmail.com/sites/default/files/docs/pdf/programmers_guide_edition_7_v5.pdf del http://www.royalmail.com/sites/default/files/docs/pdf/programmers_guide_edition_7_v5.pdf Royal Mail:
|----------------------------outward code------------------------------| |------inward code-----|
#special↓ α1 α2 AAN AANA AANN AN ANN ANA (α3) N AA
^(GIR 0AA|[A-PR-UWYZ]([A-HK-Y]([0-9][A-Z]?|[1-9][0-9])|[1-9]([0-9]|[A-HJKPSTUW])?) [0-9][ABD-HJLNP-UW-Z]{2})$
Todos los códigos doogal.co.uk coinciden en doogal.co.uk , excepto los que ya no se usan.
Agregar un ?
después del espacio y usando la concordancia de mayúsculas y minúsculas para responder esta pregunta:
''se50eg''.match(/^(GIR 0AA|[A-PR-UWYZ]([A-HK-Y]([0-9][A-Z]?|[1-9][0-9])|[1-9]([0-9]|[A-HJKPSTUW])?) ?[0-9][ABD-HJLNP-UW-Z]{2})$/ig);
Array [ "se50eg" ]
Parece que vamos a usar ^(GIR ?0AA|[A-PR-UWYZ]([0-9]{1,2}|([A-HK-Y][0-9]([0-9ABEHMNPRV-Y])?)|[0-9][A-HJKPS-UW]) ?[0-9][ABD-HJLNP-UW-Z]{2})$
, que es una versión ligeramente modificada de eso sugerido por Minglis arriba.
Sin embargo, vamos a tener que investigar exactamente cuáles son las reglas, ya que las diversas soluciones enumeradas anteriormente parecen aplicar reglas diferentes sobre qué letras están permitidas.
Después de algunas investigaciones, hemos encontrado más información. Al parecer, una página en ''govtalk.gov.uk'' te dirige a una especificación de código postal govtalk-postcodes . Esto apunta a un esquema XML en XML Schema que proporciona una declaración ''pseudo regex'' de las reglas de código postal.
Tomamos eso y trabajamos un poco para darnos la siguiente expresión:
^((GIR &0AA)|((([A-PR-UWYZ][A-HK-Y]?[0-9][0-9]?)|(([A-PR-UWYZ][0-9][A-HJKSTUW])|([A-PR-UWYZ][A-HK-Y][0-9][ABEHMNPRV-Y]))) &[0-9][ABD-HJLNP-UW-Z]{2}))$
Esto hace que los espacios sean opcionales, pero te limita a un espacio (reemplaza el ''&'' por ''{0,} para espacios ilimitados). Se supone que todo el texto debe estar en mayúscula.
Si desea permitir minúsculas, con cualquier cantidad de espacios, use:
^(([gG][iI][rR] {0,}0[aA]{2})|((([a-pr-uwyzA-PR-UWYZ][a-hk-yA-HK-Y]?[0-9][0-9]?)|(([a-pr-uwyzA-PR-UWYZ][0-9][a-hjkstuwA-HJKSTUW])|([a-pr-uwyzA-PR-UWYZ][a-hk-yA-HK-Y][0-9][abehmnprv-yABEHMNPRV-Y]))) {0,}[0-9][abd-hjlnp-uw-zABD-HJLNP-UW-Z]{2}))$
Esto no cubre los territorios de ultramar y solo aplica el formato, NO la existencia de diferentes áreas. Se basa en las siguientes reglas:
Puede aceptar los siguientes formatos:
- "GIR 0AA"
- A9 9ZZ
- A99 9ZZ
- AB9 9ZZ
- AB99 9ZZ
- A9C 9ZZ
- AD9E 9ZZ
Dónde:
- 9 puede ser cualquier número de un solo dígito.
- A puede ser cualquier letra excepto Q, V o X.
- B puede ser cualquier letra excepto I, J o Z.
- C puede ser cualquier letra excepto I, L, M, N, O, P, Q, R, V, X, Y o Z.
- D puede ser cualquier letra excepto I, J o Z.
- E puede ser cualquiera de A, B, E, H, M, N, P, R, V, W, X o Y.
- Z puede ser cualquier letra excepto C, I, K, M, O o V.
Los mejores deseos
Colin
Primera mitad del código postal Formatos válidos
- [AZ] [AZ] [0-9] [AZ]
- [AZ] [AZ] [0-9] [0-9]
- [AZ] [0-9] [0-9]
- [AZ] [AZ] [0-9]
- [AZ] [AZ] [AZ]
- [AZ] [0-9] [AZ]
- [AZ] [0-9]
Excepciones
Posición 1 - QVX no utilizado
Posición 2 - IJZ no utilizado excepto en GIR 0AA
Posición 3: solo AEHMNPRTVXY se usó
Posición 4 - ABEHMNPRVWXY
La segunda mitad del código postal
- [0-9] [AZ] [AZ]
Excepciones
Posición 2 + 3 - CIKMOV no utilizado
Recuerde que no se utilizan todos los códigos posibles, por lo que esta lista es una condición necesaria pero no suficiente para un código válido. ¿Podría ser más fácil simplemente coincidir con una lista de todos los códigos válidos?
Quería una expresión regular simple, donde está bien permitir demasiado, pero no negar un código postal válido. Fui con esto (la entrada es una cadena stripped / trimmed):
/^([a-z0-9]/s*){5,7}$/i
Las longitudes de 5 a 7 (sin contar espacios en blanco) significa que permitimos los códigos postales más cortos posibles, como "L1 8JQ", así como los más largos, como "OL14 5ET".
EDITAR: Cambió el 8 a un 7, por lo que no permitimos códigos postales de 8 caracteres.
Tengo la expresión regular para la validación del código postal del Reino Unido.
Esto funciona para todo tipo de código postal ya sea interno o externo
^((([A-PR-UWYZ][0-9])|([A-PR-UWYZ][0-9][0-9])|([A-PR-UWYZ][A-HK-Y][0-9])|([A-PR-UWYZ][A-HK-Y][0-9][0-9])|([A-PR-UWYZ][0-9][A-HJKSTUW])|([A-PR-UWYZ][A-HK-Y][0-9][ABEHMNPRVWXY]))) || ^((GIR)[ ]?(0AA))$|^(([A-PR-UWYZ][0-9])[ ]?([0-9][ABD-HJLNPQ-UW-Z]{0,2}))$|^(([A-PR-UWYZ][0-9][0-9])[ ]?([0-9][ABD-HJLNPQ-UW-Z]{0,2}))$|^(([A-PR-UWYZ][A-HK-Y0-9][0-9])[ ]?([0-9][ABD-HJLNPQ-UW-Z]{0,2}))$|^(([A-PR-UWYZ][A-HK-Y0-9][0-9][0-9])[ ]?([0-9][ABD-HJLNPQ-UW-Z]{0,2}))$|^(([A-PR-UWYZ][0-9][A-HJKS-UW0-9])[ ]?([0-9][ABD-HJLNPQ-UW-Z]{0,2}))$|^(([A-PR-UWYZ][A-HK-Y0-9][0-9][ABEHMNPRVWXY0-9])[ ]?([0-9][ABD-HJLNPQ-UW-Z]{0,2}))$
Esto funciona para todo tipo de formato.
Ejemplo:
AB10 --------------------> SOLO CODIGO POSTAL EXTERIOR
A1 1AA ------------------> COMBINACIÓN DEL CÓDIGO POSTAL (EXTERIOR E INTERNO)
WC2A --------------------> EXTERIOR
Una publicación anterior pero todavía bastante alta en los resultados de Google, así que pensé en actualizarla. Este documento del 14 de octubre define la expresión regular del código postal del Reino Unido como:
^([Gg][Ii][Rr] 0[Aa]{2})|((([A-Za-z][0-9]{1,2})|(([A-Za-z][A-Ha-hJ-Yj-y][0-9]{1,2})|(([**AZ**a-z][0-9][A-Za-z])|([A-Za-z][A-Ha-hJ-Yj-y][0-9]?[A-Za-z])))) [0-9][A-Za-z]{2})$
de:
El documento también explica la lógica detrás de esto. Sin embargo, tiene un error (en negrita) y también permite minúsculas, que aunque legales no son habituales, la versión modificada:
^(GIR 0AA)|((([A-Z][0-9]{1,2})|(([A-Z][A-HJ-Y][0-9]{1,2})|(([A-Z][0-9][A-Z])|([A-Z][A-HJ-Y][0-9]?[A-Z])))) [0-9][A-Z]{2})$
Esto funciona con los nuevos códigos postales de Londres (por ejemplo, W1D 5LH) que las versiones anteriores no.
Utilizo la siguiente expresión regular que he probado contra todos los códigos postales válidos del Reino Unido. Se basa en las reglas recomendadas, pero se condensa tanto como sea razonable y no hace uso de ninguna regla especial de expresiones regulares específicas del idioma.
([A-PR-UWYZ]([A-HK-Y][0-9]([0-9]|[ABEHMNPRV-Y])?|[0-9]([0-9]|[A-HJKPSTUW])?) ?[0-9][ABD-HJLNP-UW-Z]{2})
Supone que el código postal se ha convertido a mayúsculas y no tiene caracteres iniciales o finales, pero aceptará un espacio opcional entre el código de salida y el código de entrada.
El código especial "GIR0 0AA" está excluido y no se validará ya que no está en la lista oficial de códigos postales de la Oficina Postal y, por lo que sé, no se usará como dirección registrada. Agregarlo debería ser trivial como un caso especial si es necesario.
así es como hemos estado lidiando con el problema del código postal del Reino Unido:
^([A-Za-z]{1,2}[0-9]{1,2}[A-Za-z]?[ ]?)([0-9]{1}[A-Za-z]{2})$
Explicación:
- espere 1 o 2 az caracteres, multa superior o inferior
- espera 1 o 2 números
- esperar 0 o 1 az char, multa superior o inferior
- espacio opcional permitido
- esperar 1 numero
- esperar 2 az, multa superior o inferior
Esto obtiene la mayoría de los formatos, luego usamos el db para validar si el código postal es realmente real, esta información es manejada por el punto abierto https://www.ordnancesurvey.co.uk/opendatadownload/products.html
espero que esto ayude
Reglas básicas:
^[A-Z]{1,2}[0-9R][0-9A-Z]? [0-9][ABD-HJLNP-UW-Z]{2}$
Los códigos postales en el Reino Unido (o los códigos postales, como se los llama) se componen de cinco a siete caracteres alfanuméricos separados por un espacio. Las reglas que cubren qué personajes pueden aparecer en posiciones particulares son bastante complicadas y plagadas de excepciones. La expresión regular que se acaba de mostrar se atiene a las reglas básicas.
Reglas completas:
Si necesita una expresión regular que marque todos los cuadros de las reglas del código postal a expensas de la legibilidad, aquí tiene:
^(?:(?:[A-PR-UWYZ][0-9]{1,2}|[A-PR-UWYZ][A-HK-Y][0-9]{1,2}|[A-PR-UWYZ][0-9][A-HJKSTUW]|[A-PR-UWYZ][A-HK-Y][0-9][ABEHMNPRV-Y]) [0-9][ABD-HJLNP-UW-Z]{2}|GIR 0AA)$
Probado en nuestra base de datos de clientes y parece perfectamente exacto.
I needed a version that would work in SAS with the PRXMATCH
and related functions, so I came up with this:
^[A-PR-UWYZ](([A-HK-Y]?/d/d?)|(/d[A-HJKPSTUW])|([A-HK-Y]/d[ABEHMNPRV-Y]))/s?/d[ABD-HJLNP-UW-Z]{2}$
Test cases and notes:
/*
Notes
The letters QVX are not used in the 1st position.
The letters IJZ are not used in the second position.
The only letters to appear in the third position are ABCDEFGHJKPSTUW when the structure starts with A9A.
The only letters to appear in the fourth position are ABEHMNPRVWXY when the structure starts with AA9A.
The final two letters do not use the letters CIKMOV, so as not to resemble digits or each other when hand-written.
*/
/*
Bits and pieces
1st position (any): [A-PR-UWYZ]
2nd position (if letter): [A-HK-Y]
3rd position (A1A format): [A-HJKPSTUW]
4th position (AA1A format): [ABEHMNPRV-Y]
Last 2 positions: [ABD-HJLNP-UW-Z]
*/
data example;
infile cards truncover;
input valid 1. postcode &$10. Notes &$100.;
flag = prxmatch(''/^[A-PR-UWYZ](([A-HK-Y]?/d/d?)|(/d[A-HJKPSTUW])|([A-HK-Y]/d[ABEHMNPRV-Y]))/s?/d[ABD-HJLNP-UW-Z]{2}$/'',strip(postcode));
cards;
1 EC1A 1BB Special case 1
1 W1A 0AX Special case 2
1 M1 1AE Standard format
1 B33 8TH Standard format
1 CR2 6XH Standard format
1 DN55 1PT Standard format
0 QN55 1PT Bad letter in 1st position
0 DI55 1PT Bad letter in 2nd position
0 W1Z 0AX Bad letter in 3rd position
0 EC1Z 1BB Bad letter in 4th position
0 DN55 1CT Bad letter in 2nd group
0 A11A 1AA Invalid digits in 1st group
0 AA11A 1AA 1st group too long
0 AA11 1AAA 2nd group too long
0 AA11 1AAA 2nd group too long
0 AAA 1AA No digit in 1st group
0 AA 1AA No digit in 1st group
0 A 1AA No digit in 1st group
0 1A 1AA Missing letter in 1st group
0 1 1AA Missing letter in 1st group
0 11 1AA Missing letter in 1st group
0 AA1 1A Missing letter in 2nd group
0 AA1 1 Missing letter in 2nd group
;
run;
Recomiendo echar un vistazo al estándar de datos del gobierno del Reino Unido para los códigos postales [link now dead; archivo de XML , ver Wikipedia para discusión]. Hay una breve descripción de los datos y el esquema xml adjunto proporciona una expresión regular. Puede que no sea exactamente lo que quieres, pero sería un buen punto de partida. El RegEx difiere ligeramente del XML, ya que la definición dada permite un carácter P en la tercera posición en el formato A9A 9AA.
El RegEx suministrado por el gobierno del Reino Unido fue:
([Gg][Ii][Rr] 0[Aa]{2})|((([A-Za-z][0-9]{1,2})|(([A-Za-z][A-Ha-hJ-Yj-y][0-9]{1,2})|(([A-Za-z][0-9][A-Za-z])|([A-Za-z][A-Ha-hJ-Yj-y][0-9]?[A-Za-z]))))/s?[0-9][A-Za-z]{2})
Como se señaló en la discusión de Wikipedia, esto permitirá algunos códigos postales no reales (por ejemplo, los que comienzan con AA, ZY) y proporcionan una prueba más rigurosa que podría intentar.
What i have found in nearly all the variations and the regex from the bulk transfer pdf and what is on wikipedia site is this, specifically for the wikipedia regex is, there needs to be a ^ after the first |(vertical bar). I figured this out by testing for AA9A 9AA, because otherwise the format check for A9A 9AA will validate it. For Example checking for EC1D 1BB which should be invalid comes back valid because C1D 1BB is a valid format.
Here is what I''ve come up with for a good regex:
^([G][I][R] 0[A]{2})|^((([A-Z-[QVX]][0-9]{1,2})|([A-Z-[QVX]][A-HK-Y][0-9]{1,2})|([A-Z-[QVX]][0-9][ABCDEFGHJKPSTUW])|([A-Z-[QVX]][A-HK-Y][0-9][ABEHMNPRVWXY])) [0-9][A-Z-[CIKMOV]]{2})$
here you can find a few helpful links, depends on what language you are using:
^([A-PR-UWYZ0-9][A-HK-Y0-9][AEHMNPRTVXY0-9]?[ABEHMNPRVWXY0-9]? {1,2}[0-9][ABD-HJLN-UW-Z]{2}|GIR 0AA)$
Expresión regular para coincidir con los códigos postales válidos del Reino Unido. En el sistema postal del Reino Unido, no todas las letras se usan en todas las posiciones (lo mismo con las placas de matrícula del vehículo) y existen varias reglas para regular esto. Esta expresión regular tiene en cuenta esas reglas. Detalles de las reglas: Primera mitad del código postal Formatos válidos [AZ] [AZ] [0-9] [AZ] [AZ] [AZ] [0-9] [0-9] [AZ] [0-9] [ 0-9] [AZ] [AZ] [0-9] [AZ] [AZ] [AZ] [AZ] [0-9] [AZ] [AZ] [0-9] Excepciones Posición - Primero. Contraint - QVX no utilizado Posición - Segundo. Contraint - IJZ no utilizado excepto en la posición GIR 0AA - Tercero. Restricción - AEHMNPRTVXY solo utilizó Posición - Adelante. Contraint - ABEHMNPRVWXY Segunda mitad del código postal Formatos válidos [0-9] [AZ] [AZ] Excepciones Posición - Segundo y tercero. Contraint - CIKMOV no utilizado