Estoy detrás de una expresión regular que validará un código postal complejo completo del Reino Unido solo dentro de una cadena de entrada. Todos los formularios de códigos postales poco comunes deben estar cubiertos, así como lo habitual. Por ejemplo:
Partidos
- CW3 9SS
- SE5 0EG
- SE50EG
- se5 0eg
- WC2H 7LT
Sin coincidencia
- aWC2H 7LT
- WC2H 7LTa
- WC2H
¿Cómo resuelvo este problema?
regex
validation
regex-group
postal-code
Kieran Benton
fuente
fuente
Respuestas:
Recomiendo echar un vistazo al Estándar de datos del gobierno del Reino Unido para códigos postales [enlace ahora muerto; archivo de XML , ver Wikipedia para discusión]. Hay una breve descripción sobre los datos y el esquema xml adjunto proporciona una expresión regular. Puede que no sea exactamente lo que desea, 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 formato A9A 9AA.
El RegEx suministrado por el Gobierno del Reino Unido fue:
Como se señaló en la discusión de Wikipedia, esto permitirá algunos códigos postales no reales (por ejemplo, aquellos que comienzan AA, ZY) y proporcionan una prueba más rigurosa que podría probar.
fuente
^([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})|(([AZa-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})$
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 la sugerida 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 diferentes reglas sobre qué letras están permitidas.
Después de algunas investigaciones, hemos encontrado más información. Aparentemente, una página en 'govtalk.gov.uk' lo señala 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 del código postal.
Tomamos eso y trabajamos un poco para darnos la siguiente expresión:
Esto hace que los espacios sean opcionales, pero lo limita a un espacio (reemplace '&' con '{0,} para espacios ilimitados). Se supone que todo el texto debe estar en mayúscula.
Si desea permitir minúsculas, con cualquier número de espacios, use:
Esto no cubre territorios en el extranjero y solo impone el formato, NO la existencia de diferentes áreas. Se basa en las siguientes reglas:
Puede aceptar los siguientes formatos:
Dónde:
Los mejores deseos
Colin
fuente
^(([gG][iI][rR] {0,}0[aA]{2})|(([aA][sS][cC][nN]|[sS][tT][hH][lL]|[tT][dD][cC][uU]|[bB][bB][nN][dD]|[bB][iI][qQ][qQ]|[fF][iI][qQ][qQ]|[pP][cC][rR][nN]|[sS][iI][qQ][qQ]|[iT][kK][cC][aA]) {0,}1[zZ]{2})|((([a-pr-uwyzA-PR-UWYZ][a-hk-yxA-HK-XY]?[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}))$
{0,}
lugar de*
espacios ilimitados y opcionales?Recientemente he publicado una respuesta a esta pregunta en los códigos postales del Reino Unido para el lenguaje R . Descubrí que el patrón de expresiones regulares del gobierno del Reino Unido es incorrecto y no funciona correctamente valida algunos códigos postales. Desafortunadamente, muchas de las respuestas aquí se basan en este patrón incorrecto.
Esbozaré algunos de estos problemas a continuación y proporcionaré una expresión regular revisada que realmente funcione.
Nota
Mi respuesta (y expresiones regulares en general):
Si no te importa la expresión regular incorrecta y solo quieres saltar a la respuesta, desplázate hacia abajo hasta la sección Respuesta .
The Bad Regex
Las expresiones regulares en esta sección no deben usarse.
Esta es la expresión regular fallida que el gobierno del Reino Unido ha proporcionado a los desarrolladores (no estoy seguro de cuánto tiempo estará activo este enlace, pero puede verlo en su documentación de Transferencia de datos a granel ):
Problemas
Problema 1 - Copiar / Pegar
Ver expresiones regulares en uso aquí .
Como muchos desarrolladores probablemente hacen, copian / pegan código (especialmente expresiones regulares) y los pegan esperando que funcionen. Si bien esto es excelente en teoría, falla en este caso particular porque la copia / pegado de este documento en realidad cambia uno de los caracteres (un espacio) a un carácter de nueva línea como se muestra a continuación:
Lo primero que harán la mayoría de los desarrolladores es borrar la nueva línea sin pensarlo dos veces. Ahora la expresión regular no coincidirá con los códigos postales con espacios en ellos (aparte del
GIR 0AA
código postal).Para solucionar este problema, el carácter de nueva línea debe reemplazarse con el carácter de espacio:
Problema 2 - Límites
Ver expresiones regulares en uso aquí .
El código postal regex ancla incorrectamente el regex. Cualquiera que use esta expresión regular para validar códigos postales podría sorprenderse si un valor como
fooA11 1AA
pasa. Eso es porque han anclado el inicio de la primera opción y el final de la segunda opción (independientemente uno del otro), como se señala en la expresión regular anterior.Lo que esto significa es que
^
(afirma la posición al comienzo de la línea) solo funciona en la primera opción([Gg][Ii][Rr] 0[Aa]{2})
, por lo que la segunda opción validará cualquier cadena que termine en un código postal (independientemente de lo que ocurra antes).Del mismo modo, la primera opción no está anclada al final de la línea
$
, porGIR 0AAfoo
lo que también se acepta.Para solucionar este problema, ambas opciones deben estar envueltas en otro grupo (o grupo que no sea de captura) y los anclajes colocados alrededor de eso:
Problema 3: juego de caracteres incorrecto
Ver expresiones regulares en uso aquí .
Al regex le falta un
-
aquí para indicar un rango de caracteres. Tal como está, si un código postal está en el formatoANA NAA
(dondeA
representa una letra yN
representa un número), y comienza con cualquier cosa que no seaA
oZ
, fallará.Eso significa que coincidirá
A1A 1AA
yZ1A 1AA
, pero noB1A 1AA
.Para solucionar este problema, el carácter se
-
debe colocar entreA
yZ
en el conjunto de caracteres correspondiente:Problema 4: juego de caracteres opcional incorrecto
Ver expresiones regulares en uso aquí .
Juro que ni siquiera probaron esto antes de publicitarlo en la web. Hicieron el juego de caracteres incorrecto opcional. Hicieron
[0-9]
opción en la cuarta subopción de la opción 2 (grupo 9). Esto permite que la expresión regular coincida con códigos postales con formato incorrecto comoAAA 1AA
.Para solucionar este problema, haga que la siguiente clase de caracteres sea opcional (y luego haga que el conjunto
[0-9]
coincida exactamente una vez):Problema 5 - Rendimiento
El rendimiento en esta expresión regular es extremadamente pobre. En primer lugar, colocaron la opción de patrón menos probable para que coincida
GIR 0AA
al principio. ¿Cuántos usuarios tendrán este código postal en comparación con cualquier otro código postal? ¿probablemente nunca? Esto significa que cada vez que se utiliza la expresión regular, debe agotar esta opción antes de pasar a la siguiente. Para ver cómo se ve afectado el rendimiento, verifique el número de pasos que tomó la expresión regular original (35) contra la misma expresión regular después de haber cambiado las opciones (22).El segundo problema con el rendimiento se debe a la forma en que se estructura toda la expresión regular. No tiene sentido retroceder sobre cada opción si una falla. La forma en que se estructura la expresión regular actual se puede simplificar enormemente. Proporciono una solución para esto en la sección Respuesta .
Problema 6 - Espacios
Ver expresiones regulares en uso aquí
Esto puede no considerarse un problema , per se, pero genera preocupación para la mayoría de los desarrolladores. Los espacios en la expresión regular no son opcionales, lo que significa que los usuarios que ingresan sus códigos postales deben colocar un espacio en el código postal. Esta es una solución fácil simplemente agregando
?
después de los espacios para hacerlos opcionales. Vea la sección de Respuesta para una solución.Responder
1. Arreglando la expresión regular del gobierno del Reino Unido
Solucionar todos los problemas descritos en la sección Problemas y simplificar el patrón produce el siguiente patrón, más corto y conciso. También podemos eliminar la mayoría de los grupos ya que estamos validando el código postal en su conjunto (no partes individuales):
Ver expresiones regulares en uso aquí
Esto se puede acortar aún más eliminando todos los rangos de uno de los casos (mayúsculas o minúsculas) y utilizando una marca que no distinga entre mayúsculas y minúsculas. Nota : Algunos idiomas no tienen uno, así que use el más largo de arriba. Cada idioma implementa el distintivo de mayúsculas y minúsculas de manera diferente.
Ver expresiones regulares en uso aquí .
Más corto de nuevo reemplazando
[0-9]
con\d
(si su motor regex lo admite):Ver expresiones regulares en uso aquí .
2. Patrones simplificados
Sin garantizar caracteres alfabéticos específicos, se puede utilizar lo siguiente (tenga en cuenta las simplificaciones de 1. La fijación de la expresión regular del gobierno del Reino Unido también se ha aplicado aquí):
Ver expresiones regulares en uso aquí .
Y aún más si no te importa el caso especial
GIR 0AA
:3. Patrones complicados
No sugeriría una verificación excesiva de un código postal, ya que pueden aparecer nuevas áreas, distritos y subdistritos en cualquier momento. Lo que sugeriré hacer potencialmente es agregar soporte para casos extremos. Existen algunos casos especiales y se describen en este artículo de Wikipedia .
Aquí hay expresiones regulares complejas que incluyen las subsecciones de 3. (3.1, 3.2, 3.3).
En relación con los patrones en 1. Arreglando la expresión regular del gobierno del Reino Unido :
Ver expresiones regulares en uso aquí
Y en relación con 2. Patrones simplificados :
Ver expresiones regulares en uso aquí
3.1 Territorios británicos de ultramar
El artículo de Wikipedia actualmente declara (algunos formatos ligeramente simplificados):
AI-1111
: AnguilaASCN 1ZZ
: Isla AscencionSTHL 1ZZ
: Santa ElenaTDCU 1ZZ
: Tristan da CunhaBBND 1ZZ
: Territorio Británico del Océano ÍndicoBIQQ 1ZZ
: Territorio Antártico BritánicoFIQQ 1ZZ
: Islas MalvinasGX11 1ZZ
: GibraltarPCRN 1ZZ
: Islas PitcairnSIQQ 1ZZ
: Georgia del sur y las islas Sandwich del surTKCA 1ZZ
: Islas Turcas y CaicosBFPO 11
: Akrotiri y DhekeliaZZ 11
&GE CX
: Bermudas (según este documento )KY1-1111
: Islas Caimán (según este documento )VG1111
: Islas Vírgenes Británicas (según este documento )MSR 1111
: Montserrat (según este documento )Una expresión regular que lo abarque todo y que solo coincida con los Territorios Británicos de Ultramar podría verse así:
Ver expresiones regulares en uso aquí .
3.2 Oficina de correos de las fuerzas británicas
Aunque se han cambiado recientemente para alinearse mejor con el sistema de código postal británico
BF#
(donde#
representa un número), se consideran códigos postales alternativos opcionales . Estos códigos postales siguen (ed) el formato deBFPO
, seguido de 1-4 dígitos:Ver expresiones regulares en uso aquí
3.3 Santa?
Hay otro caso especial con Santa (como se menciona en otras respuestas):
SAN TA1
es un código postal válido. Una expresión regular para esto es muy simple:fuente
No existe una expresión regular completa de 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 utilizando 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 todos los números entre 1 y 99, para cada área de código postal.No puedes esperar que lo que hay actualmente sea cierto para siempre. Como ejemplo, en 1990, la oficina de correos decidió que Aberdeen se estaba abarrotando un poco. Agregaron un 0 al final de AB1-5 convirtiéndolo en 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 lo han señalado varios otros usuarios, existen códigos postales especiales como Girobank, GIR 0AA y el de cartas a Santa, SAN TA1: probablemente no desee publicar nada allí, pero parece que no estar cubierto por cualquier otra respuesta.
Luego, están los códigos postales BFPO, que ahora están cambiando a un formato más estándar . Ambos formatos serán válidos. Por último, está la fuente de los territorios de ultramar Wikipedia .
A continuación, 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 del "Reino Unido" 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 códigos postales actuales. Hay muchas opciones:
Ordnance Survey lanza Code-Point Open bajo una licencia de datos abiertos. Será un poco atrasado pero es gratis. Esto (probablemente, no puedo recordar) no incluirá datos de Irlanda del Norte, ya que la Encuesta de Artillería no tiene ninguna misión allí. El mapeo en Irlanda del Norte se lleva a cabo por la Encuesta de artillería de Irlanda del Norte y tienen su producto Pointer separado y pagado . Puede usar esto y agregar los pocos que no están cubiertos con bastante facilidad.
Royal Mail lanza el archivo de dirección de código postal (PAF) , esto incluye BFPO, que no estoy seguro de que Code-Point Open lo haga. Se actualiza regularmente pero cuesta dinero (y a veces pueden ser francamente mezquinos al respecto). PAF incluye la dirección completa en lugar de solo códigos postales y viene con su propia Guía de programadores . El Open Data User Group (ODUG) está actualmente presionando para que se publique PAF de forma gratuita, aquí hay una descripción de su posición .
Por último, está AddressBase . Esta es una colaboración entre Ordnance Survey, las autoridades locales, Royal Mail y una compañía coincidente para crear un directorio definitivo de toda la información sobre todas las direcciones del Reino Unido (también han tenido bastante éxito). Está pagado, pero si está trabajando con una Autoridad Local, un departamento gubernamental o un servicio gubernamental, es gratis para ellos. Hay mucha más información que solo códigos postales incluidos.
fuente
Eché un vistazo a algunas de las respuestas anteriores y recomendaría no usar el patrón de la respuesta de @ Dan (c. Dec 15 '10) , ya que marca incorrectamente casi el 0.4% de los códigos postales válidos como inválidos, mientras que los demás no lo hacen. .
Ordnance Survey proporciona un servicio llamado Code Point Open que:
Ejecuté cada una de las expresiones regulares anteriores con la lista completa de códigos postales (6 de julio de 13) a partir de estos datos usando
grep
: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 uno
$pattern
:Por supuesto, estos resultados solo se refieren a códigos postales válidos que se marcan incorrectamente como no válidos. Entonces:
No digo nada sobre qué patrón es el mejor para filtrar códigos postales no válidos.
fuente
http://regexlib.com/REDetails.aspx?regexp_id=260
fuente
0-9
, lo que no se puedeDe acuerdo con esta tabla de Wikipedia
Este patrón cubre todos los casos.
Cuando lo use en Android \ Java use \\ d
fuente
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, utilizando la nueva expresión regular proporcionada por el gobierno:
https://www.gov.uk/government/uploads/system/uploads/attachment_data/file/413338/Bulk_Data_Transfer_-_additional_validation_valid_from_March_2015.pdf
No está en ninguna de las respuestas anteriores, así que lo publico aquí en caso de que retiren el enlace:
ACTUALIZACIÓN: expresiones regulares actualizadas según lo indicado por Jamie Bull. No estoy seguro si fue mi error al copiar o si fue un error en la expresión regular del gobierno, el enlace está caído ahora ...
ACTUALIZACIÓN: Como se encontró en ctwheels, esta expresión regular funciona con el sabor de expresión regular de JavaScript. Vea su comentario para uno que funcione con el sabor pcre (php).
fuente
^([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})|(([AZa-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})$
debería ser^([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})$
- detectar la diferencia ;-)([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})
(eliminado^
y$
agregado?
después del espacio) para que regexr.com encuentre más de un resultado y para que ambos encuentren un resultado que no tenga un separador de espacio.(?:)
y luego anclados colocados a su alrededor. Véalo fallar aquí . Para obtener más información, vea mi respuesta aquí .^(?:([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}))$
es la expresión regular corregidaUna publicación antigua pero aún bastante alta en los resultados de Google, así que pensé en actualizar. Este documento del 14 de octubre define la expresión regular del código postal del Reino Unido como:
de:
https://www.gov.uk/government/uploads/system/uploads/attachment_data/file/359448/4__Bulk_Data_Transfer_-_additional_validation_valid.pdf
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 no es legal, la versión modificada:
Esto funciona con los nuevos códigos postales de Londres (por ejemplo, W1D 5LH) que las versiones anteriores no.
fuente
(?:)
y luego anclados colocados a su alrededor. Véalo fallar aquí . Para obtener más información, vea mi respuesta aquí .^(?:([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}))$
es la expresión regular corregidaEsta es la expresión regular que Google sirve en su dominio i18napis.appspot.com :
fuente
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á allí.
Pero las expresiones regulares son útiles porque:
Pero las expresiones regulares tienden a ser difíciles de mantener, especialmente para alguien a quien no se le ocurrió en primer lugar. Entonces debe ser:
Eso significa que la mayoría de las expresiones regulares en esta respuesta no son lo suficientemente buenas. Por ejemplo, puedo ver eso
[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 será un dolor de cabeza si se agrega una nueva á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 segunda mitad del código postal como coincidencias entre paréntesis.
Así que se me ocurrió esto:
En formato PCRE se puede escribir de la siguiente manera:
Para mí, este es el equilibrio correcto entre validar tanto como sea posible, mientras que al mismo tiempo ofrece protección contra el futuro y permite un fácil mantenimiento.
fuente
aSW1A 1AAasfg
coinciden para mí (aunque no voté en contra, ya que parece que podría arreglarse fácilmente)He estado buscando una expresión regular del código postal del Reino Unido durante el último día más o menos y me topé con este hilo. Me abrí paso a través de la mayoría de las sugerencias anteriores y ninguna de ellas funcionó para mí, así que se me ocurrió mi propia expresión regular que, hasta donde yo sé, captura todos los códigos postales válidos del Reino Unido a partir de enero '13 (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 inferiores 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 ingresado, también utiliza un simple str_replace para eliminar el espacio antes de la prueba contra la expresión regular. Cualquier discrepancia más allá de eso y el propio Royal Mail ni siquiera las mencionan en su literatura (consulte http://www.royalmail.com/sites/default/files/docs/pdf/programmers_guide_edition_7_v5.pdf y comience a leer desde la página 17) !
Nota: En la propia literatura de Royal Mail (enlace de arriba) hay una ligera ambigüedad en torno a las posiciones tercera y cuarta y las excepciones vigentes si estos caracteres son letras. Me puse en contacto con Royal Mail directamente para aclararlo y en sus propias palabras "Una carta en la cuarta posición del Código Exterior con el formato AANA NAA no tiene excepciones y las excepciones de la tercera posición se aplican solo a la última letra del Código Exterior con el formato ANA NAA ". ¡Directo de la boca del caballo!
Espero que ayude a cualquier persona que se encuentre con este hilo en busca de una solución.
fuente
SW1A
BD25
Aquí hay una expresión regular basada en el formato especificado en los documentos que están vinculados a la respuesta de marcj:
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 de los caracteres finales.
fuente
A-Z
:Q
nunca se permite,V
solo se usa con moderación, etc., dependiendo de la posición del personaje.Algunas de las expresiones regulares anteriores son un poco restrictivas. Tenga en cuenta el código postal original: "W1K 7AA" fallaría dada la regla "Posición 3 - AEHMNPRTVXY solo se usa" arriba, ya que "K" no se permitirá.
la expresión regular:
Parece un poco más preciso, vea el artículo de Wikipedia titulado 'Códigos postales en el Reino Unido' .
Tenga en cuenta que esta expresión regular requiere solo caracteres en mayúscula.
La pregunta más importante es si está restringiendo la entrada del usuario para permitir solo códigos postales que realmente existen o si simplemente está tratando de evitar que los usuarios ingresen basura completa en los campos del formulario. Hacer coincidir correctamente todos los códigos postales posibles, y probarlo en el futuro, es un rompecabezas más difícil, y probablemente no valga la pena a menos que sea HMRC.
fuente
Así es como hemos estado lidiando con el problema del código postal del Reino Unido:
Explicación:
Esto obtiene la mayoría de los formatos, luego usamos el db para validar si el código postal es realmente real, estos datos son controlados por punto abierto https://www.ordnancesurvey.co.uk/opendatadownload/products.html
espero que esto ayude
fuente
AANNA NAA
, que no es válido.Reglas básicas:
Los códigos postales en el Reino Unido (o códigos postales, como se los llama) están compuestos 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 están llenas de excepciones. La expresión regular que se acaba de mostrar se ajusta a las reglas básicas.
Reglas completas:
Si necesita una expresión regular que cumple todos los requisitos para las reglas del código postal a expensas de la legibilidad, aquí tiene:
Fuente: https://www.safaribooksonline.com/library/view/regular-expressions-cookbook/9781449327453/ch04s16.html
Probado contra la base de datos de nuestros clientes y parece perfectamente preciso.
fuente
Utilizo la siguiente expresión regular que he probado con 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 utiliza ninguna regla de expresión regular específica de un idioma especial.
Se 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 externo y el código interno.
El código postal especial "GIR0 0AA" está excluido y no se validará, ya que no está en la lista oficial de códigos postales de la Oficina de Correos y, que yo sepa, no se utilizará como dirección registrada. Agregarlo debería ser trivial como un caso especial si es necesario.
fuente
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 despojada / recortada):
Esto permite los códigos postales más cortos posibles como "L1 8JQ", así como los más largos como "OL14 5ET".
Debido a que permite hasta 8 caracteres, también permitirá códigos postales incorrectos de 8 caracteres si no hay espacio: "OL145ETX". Pero, de nuevo, esta es una expresión regular simplista, para cuando eso es lo suficientemente bueno.
fuente
Primera mitad del código postal Formatos válidos
Excepciones
Posición 1 - QVX no utilizado
Posición 2 - IJZ no utilizado excepto en GIR 0AA
Posición 3 - AEHMNPRTVXY solo utilizado
Posición 4 - ABEHMNPRVWXY
Segunda mitad del código postal
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. ¿Sería más fácil hacer coincidir una lista de todos los códigos válidos?
fuente
Para verificar que un código postal esté en un formato válido según la guía del programador de Royal Mail :
Todos los códigos postales en doogal.co.uk coinciden, excepto los que ya no están en uso.
Agregar un
?
espacio después del espacio y usar una coincidencia entre mayúsculas y minúsculas para responder esta preguntafuente
Éste permite espacios vacíos y pestañas de ambos lados en caso de que no desee fallar la validación y luego recortarlo del lado del servidor.
fuente
AAA 1AA
no es un formato válido: vea mi respuesta para obtener una explicación y solución.Para agregar a esta lista, una expresión regular más práctica que utilizo que permite al usuario ingresar una
empty string
es:Esta expresión regular permite letras mayúsculas y minúsculas con un espacio opcional en el medio
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
fuente
Echa un vistazo al código de Python en esta página:
http://www.brunningonline.net/simon/blog/archives/001292.html
Lo he usado para procesar códigos postales para mí.
fuente
Nos dieron una especificación:
Se nos ocurrió esto:
Pero tenga en cuenta: esto permite cualquier cantidad de espacios entre grupos.
fuente
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
Esto funciona para todo tipo de formato.
Ejemplo:
fuente
La respuesta aceptada refleja las reglas dadas por Royal Mail, aunque hay un error tipográfico en la expresión regular. Este error tipográfico parece haber estado allí también en el sitio gov.uk (como 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 lo permite. La expresión regular correcta sería:
Acortar esto da como resultado la siguiente expresión regular (que usa la sintaxis Perl / Ruby):
También incluye un espacio opcional entre el primer y el segundo bloque.
fuente
Lo que he encontrado en casi todas las variaciones y la expresión regular del pdf de transferencia masiva y lo que está en el sitio de Wikipedia es esto, específicamente para la expresión regular de Wikipedia, debe haber un ^ después de la primera | (barra vertical). Lo descubrí probando AA9A 9AA, porque de lo contrario la verificación de formato para A9A 9AA lo validará. Por ejemplo, la comprobación de EC1D 1BB que debería ser inválido vuelve a ser válido porque C1D 1BB es un formato válido.
Esto es lo que se me ocurrió para una buena expresión regular:
fuente
A través de pruebas y observaciones empíricas, además de confirmar con https://en.wikipedia.org/wiki/Postcodes_in_the_United_Kingdom#Validation , aquí está mi versión de una expresión regular de Python que analiza y valida correctamente un código postal del Reino Unido:
UK_POSTCODE_REGEX = r'(?P<postcode_area>[A-Z]{1,2})(?P<district>(?:[0-9]{1,2})|(?:[0-9][A-Z]))(?P<sector>[0-9])(?P<postcode>[A-Z]{2})'
Esta expresión regular es simple y tiene grupos de captura. Que no incluye todas las validaciones de legales códigos postales del Reino Unido, pero sólo tiene en cuenta la letra vs posiciones numéricas.
Así es como lo usaría en el código:
Aquí hay pruebas unitarias:
fuente
Necesitaba una versión que funcionara en SAS con las
PRXMATCH
funciones relacionadas, así que se me ocurrió esto:Casos de prueba y notas:
fuente
El siguiente método verificará el código postal y proporcionará información completa
fuente