Estou atrás de um regex que validará um código postal completo e complexo do Reino Unido somente dentro de uma sequência de entrada. Todos os formulários incomuns de códigos postais devem ser cobertos, além do usual. Por exemplo:
Partidas
- CW3 9SS
- SE5 0EG
- SE50EG
- se5 0eg
- WC2H 7LT
Sem correspondência
- aWC2H 7LT
- WC2H 7LTa
- WC2H
Como eu resolvo este problema?
regex
validation
regex-group
postal-code
Kieran Benton
fonte
fonte
Respostas:
Eu recomendaria dar uma olhada no UK Government Data Standard para códigos postais [link now dead; arquivo XML , veja Wikipedia para discussão]. Há uma breve descrição sobre os dados e o esquema xml anexado fornece uma expressão regular. Pode não ser exatamente o que você deseja, mas seria um bom ponto de partida. O RegEx difere um pouco do XML, pois um caractere P na terceira posição no formato A9A 9AA é permitido pela definição fornecida.
O RegEx fornecido pelo governo do Reino Unido era:
Como apontado na discussão da Wikipedia, isso permitirá alguns códigos postais não reais (por exemplo, aqueles que iniciam AA, ZY) e fornecem um teste mais rigoroso que você poderia tentar.
fonte
^([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 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 é uma versão ligeiramente modificada daquela sugerida por Minglis acima.No entanto, teremos que investigar exatamente quais são as regras, pois as várias soluções listadas acima parecem aplicar regras diferentes às quais letras são permitidas.
Após algumas pesquisas, encontramos mais algumas informações. Aparentemente, uma página em 'govtalk.gov.uk' aponta para uma especificação de código postal govtalk-postcodes . Isso aponta para um esquema XML no XML Schema que fornece uma instrução 'pseudo regex' das regras de código postal.
Pegamos isso e trabalhamos um pouco para nos dar a seguinte expressão:
Isso torna os espaços opcionais, mas limita você a um espaço (substitua 'e' por '{0,} para espaços ilimitados). Ele assume que todo o texto deve estar em maiúsculas.
Se você deseja permitir letras minúsculas, com qualquer número de espaços, use:
Isso não abrange territórios no exterior e apenas reforça o formato, NÃO a existência de áreas diferentes. É baseado nas seguintes regras:
Pode aceitar os seguintes formatos:
Onde:
Muitas felicidades
Colin
fonte
^(([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,}
vez de*
espaços opcionais e ilimitados?Eu recentemente postou uma resposta para esta pergunta em códigos postais do Reino Unido para a linguagem R . Descobri que o padrão de regex do governo do Reino Unido está incorreto e falha ao validar corretamente alguns códigos postais. Infelizmente, muitas das respostas aqui são baseadas neste padrão incorreto.
Vou descrever alguns desses problemas abaixo e fornecer uma expressão regular revisada que realmente funciona.
Nota
Minha resposta (e expressões regulares em geral):
Se você não se importa com a regex incorreta e deseja apenas pular para a resposta, role para baixo até a seção Resposta .
The Bad Regex
As expressões regulares nesta seção não devem ser usadas.
Este é o regex com falha que o governo do Reino Unido forneceu aos desenvolvedores (não sabe quanto tempo esse link ficará ativo, mas você pode vê-lo na documentação da Transferência de dados em massa ):
Problemas
Problema 1 - Copiar / Colar
Veja regex em uso aqui .
Como muitos desenvolvedores provavelmente copiam / colam código (especialmente expressões regulares) e os colam esperando que funcionem. Embora isso seja ótimo em teoria, ele falha neste caso específico, porque copiar / colar deste documento realmente altera um dos caracteres (um espaço) para um caractere de nova linha, como mostrado abaixo:
A primeira coisa que a maioria dos desenvolvedores fará é apagar a nova linha sem pensar duas vezes. Agora, a regex não corresponderá aos códigos postais com espaços (exceto o
GIR 0AA
código postal).Para corrigir esse problema, o caractere de nova linha deve ser substituído pelo caractere de espaço:
Problema 2 - Limites
Veja regex em uso aqui .
O código postal regex ancora incorretamente o regex. Qualquer pessoa que use esse regex para validar códigos postais pode se surpreender se um valor como o
fooA11 1AA
passar. Isso ocorre porque eles ancoraram o início da primeira opção e o final da segunda opção (independentemente uma da outra), conforme apontado no regex acima.O que isso significa é que
^
(afirma a posição no início da linha) funciona apenas na primeira opção([Gg][Ii][Rr] 0[Aa]{2})
; portanto, a segunda opção validará todas as strings que terminam em um código postal (independentemente do que vem antes).Da mesma forma, a primeira opção não está ancorada no final da linha
$
,GIR 0AAfoo
também é aceita.Para corrigir esse problema, as duas opções devem ser agrupadas em outro grupo (ou grupo que não captura) e as âncoras colocadas em torno dele:
Problema 3 - Conjunto de caracteres inadequado
Veja regex em uso aqui .
O regex está ausente
-
aqui para indicar um intervalo de caracteres. Tal como está, se um código postal estiver no formatoANA NAA
(ondeA
representa uma letra eN
um número) e começar com algo diferente deA
ouZ
, falhará.Isso significa que corresponderá
A1A 1AA
eZ1A 1AA
, mas nãoB1A 1AA
.Para corrigir esse problema, o caractere
-
deve ser colocado entreA
eZ
no respectivo conjunto de caracteres:Problema 4 - Conjunto de caracteres opcional errado
Veja regex em uso aqui .
Juro que eles nem testaram isso antes de publicá-lo na web. Eles tornaram o conjunto de caracteres errado opcional. Eles fizeram a
[0-9]
opção na quarta subopção da opção 2 (grupo 9). Isso permite que o regex corresponda a códigos postais formatados incorretamente, comoAAA 1AA
.Para corrigir esse problema, torne opcional a próxima classe de caractere (e subseqüentemente faça o conjunto
[0-9]
corresponder exatamente uma vez):Problema 5 - Desempenho
O desempenho nesse regex é extremamente ruim. Primeiro, eles colocaram a opção de padrão menos provável de corresponder
GIR 0AA
no início. Quantos usuários provavelmente terão esse código postal em comparação com qualquer outro código postal; provavelmente nunca? Isso significa que toda vez que a regex é usada, ela deve esgotar essa opção antes de prosseguir para a próxima opção. Para ver como o desempenho é afetado, verifique o número de etapas que a regex original executou (35) na mesma regex após ter invertido as opções (22).O segundo problema com o desempenho se deve à maneira como toda a regex está estruturada. Não faz sentido voltar atrás em cada opção se uma falhar. A maneira como o regex atual é estruturado pode ser bastante simplificada. Eu forneço uma correção para isso na seção Resposta .
Problema 6 - Espaços
Veja regex em uso aqui
Isso pode não ser considerado um problema , por si só, mas gera preocupação para a maioria dos desenvolvedores. Os espaços no regex não são opcionais, o que significa que os usuários que inserem seus códigos postais devem colocar um espaço no código postal. Essa é uma solução fácil, basta adicionar
?
após os espaços para torná-los opcionais. Consulte a seção Resposta para uma correção.Responda
1. Corrigindo o Regex do governo do Reino Unido
A correção de todos os problemas descritos na seção Problemas e a simplificação do padrão produz o seguinte padrão, mais curto e conciso. Também podemos remover a maioria dos grupos, pois estamos validando o código postal como um todo (não partes individuais):
Veja regex em uso aqui
Isso pode ser reduzido ainda mais, removendo todos os intervalos de um dos casos (maiúsculas ou minúsculas) e usando um sinalizador que não diferencia maiúsculas de minúsculas. Nota : Alguns idiomas não têm um, portanto, use o mais longo acima. Cada idioma implementa o sinalizador de distinção entre maiúsculas e minúsculas de maneira diferente.
Veja regex em uso aqui .
Shorter novamente substituindo
[0-9]
com\d
(se o seu motor regex suporta):Veja regex em uso aqui .
2. Padrões simplificados
Sem garantir caracteres alfabéticos específicos, é possível usar o seguinte (lembre-se das simplificações de 1. A correção do Regex do governo do Reino Unido também foi aplicada aqui):
Veja regex em uso aqui .
E ainda mais se você não se importa com o caso especial
GIR 0AA
:3. Padrões complicados
Eu não sugeriria a verificação excessiva de um código postal, pois novas áreas, distritos e subdistritos podem aparecer a qualquer momento. O que eu sugiro fazer potencialmente é o suporte adicional para casos extremos. Alguns casos especiais existem e são descritos neste artigo da Wikipedia .
Aqui estão as expressões regulares complexas que incluem as subseções de 3. (3.1, 3.2, 3.3).
Em relação aos padrões em 1. Fixing Regex do governo do Reino Unido :
Veja regex em uso aqui
E em relação a 2. Padrões simplificados :
Veja regex em uso aqui
3.1 Territórios ultramarinos britânicos
O artigo da Wikipedia afirma atualmente (alguns formatos ligeiramente simplificados):
AI-1111
: AnguilaASCN 1ZZ
: Ilha da AscensãoSTHL 1ZZ
: Santa HelenaTDCU 1ZZ
: Tristan da CunhaBBND 1ZZ
: Território Britânico do Oceano ÍndicoBIQQ 1ZZ
: Território Antártico BritânicoFIQQ 1ZZ
: Ilhas MalvinasGX11 1ZZ
: GibraltarPCRN 1ZZ
: Ilhas PitcairnSIQQ 1ZZ
: Ilhas Geórgia do Sul e Sandwich do SulTKCA 1ZZ
: Ilhas Turcas e CaicosBFPO 11
: Akrotiri e DhekeliaZZ 11
&GE CX
: Bermuda (de acordo com este documento )KY1-1111
: Ilhas Cayman (de acordo com este documento )VG1111
: Ilhas Virgens Britânicas (de acordo com este documento )MSR 1111
: Montserrat (de acordo com este documento )Um regex abrangente para corresponder apenas aos Territórios Ultramarinos Britânicos pode ser assim:
Veja regex em uso aqui .
3.2 Correios das forças britânicas
Embora tenham sido alterados recentemente para melhor alinhar-se ao sistema de código postal britânico para
BF#
(onde#
representa um número), eles são considerados códigos postais alternativos opcionais . Esses códigos postais seguem (ed) o formato deBFPO
, seguido por 1 a 4 dígitos:Veja regex em uso aqui
3.3 Papai Noel?
Há outro caso especial com o Papai Noel (como mencionado em outras respostas):
SAN TA1
é um código postal válido. Um regex para isso é muito simples:fonte
Não existe uma expressão regular abrangente de código postal do Reino Unido capaz de validar um código postal. Você pode verificar se um código postal está no formato correto usando uma expressão regular; não que ele realmente exista.
Os códigos postais são arbitrariamente complexos e mudam constantemente. Por exemplo, o código de saída
W1
não tem e pode nunca ter todos os números entre 1 e 99, para cada área de código postal.Você não pode esperar que o que existe atualmente seja verdadeiro para sempre. Como exemplo, em 1990, os Correios decidiram que Aberdeen estava ficando um pouco lotado. Eles adicionaram um 0 ao final do AB1-5, tornando-o AB10-50 e, em seguida, criaram vários códigos postais entre eles.
Sempre que uma nova rua é construída, um novo código postal é criado. Faz parte do processo para obter permissão para construir; as autoridades locais são obrigadas a manter isso atualizado com os Correios (não que todos o façam).
Além disso, como observado por vários outros usuários, existem os códigos postais especiais, como o Girobank, o GIR 0AA e o de cartas para o Papai Noel, SAN TA1 - você provavelmente não deseja publicar nada lá, mas parece que não ser coberto por qualquer outra resposta.
Depois, há os códigos postais do BFPO, que agora estão mudando para um formato mais padrão . Ambos os formatos serão válidos. Por fim, há a fonte de territórios no exterior da Wikipedia .
Em seguida, você deve levar em conta que o Reino Unido "exportou" seu sistema de códigos postais para muitos lugares do mundo. Qualquer coisa que valide um código postal do "Reino Unido" também validará os códigos postais de vários outros países.
Se você deseja validar um código postal do Reino Unido, a maneira mais segura de fazer isso é usar uma pesquisa dos códigos postais atuais. Há uma série de opções:
O Ordnance Survey libera o Code-Point Open sob uma licença de dados abertos. Vai ser um pouco atrasado, mas é grátis. Isso (provavelmente - não me lembro) não incluirá dados da Irlanda do Norte, pois o Ordnance Survey não tem remessas para lá. O mapeamento na Irlanda do Norte é conduzido pelo Ordnance Survey da Irlanda do Norte e eles têm seu produto Pointer separado e pago . Você pode usar isso e anexar os poucos que não são abordados com bastante facilidade.
O Royal Mail lança o PAF (Postcode Address File) , que inclui o BFPO, que não tenho certeza se o Code-Point Open faz. É atualizado regularmente, mas custa dinheiro (e às vezes pode ser totalmente mesquinho). O PAF inclui o endereço completo em vez de apenas códigos postais e vem com seu próprio Guia do Programador . O Grupo de Usuários de Dados Abertos (ODUG) está atualmente fazendo lobby para que o PAF seja liberado gratuitamente, aqui está uma descrição de sua posição .
Por fim, há AddressBase . Esta é uma colaboração entre a Ordnance Survey, as autoridades locais, o Royal Mail e uma empresa correspondente para criar um diretório definitivo de todas as informações sobre todos os endereços do Reino Unido (eles também tiveram bastante sucesso). É pago, mas se você estiver trabalhando com uma autoridade local, departamento do governo ou serviço do governo, é gratuito para eles usarem. Há muito mais informações do que apenas códigos postais incluídos.
fonte
Analisei algumas das respostas acima e recomendo não usar o padrão da resposta de @ Dan (c. 15/12/10) , pois sinaliza incorretamente quase 0,4% dos códigos postais válidos como inválidos, enquanto os outros não. .
O Ordnance Survey fornece um serviço chamado Code Point Open que:
Executei cada uma das regexs acima na lista completa de códigos postais (6 de julho de 13) a partir desses dados usando
grep
:Existem 1.686.202 códigos postais no total.
A seguir, são apresentados os números de códigos postais válidos que não correspondem a cada um
$pattern
:Obviamente, esses resultados lidam apenas com códigos postais válidos que são sinalizados incorretamente como inválidos. Assim:
Não estou dizendo nada sobre qual padrão é o melhor para filtrar códigos postais inválidos.
fonte
http://regexlib.com/REDetails.aspx?regexp_id=260
fonte
0-9
, que você não podeDe acordo com esta tabela da Wikipedia
Esse padrão cobre todos os casos
Ao usá-lo no Android \ Java, use \\ d
fonte
A maioria das respostas aqui não funcionou para todos os códigos postais que tenho no meu banco de dados. Finalmente encontrei um que valida com todos, usando o novo regex fornecido pelo governo:
https://www.gov.uk/government/uploads/system/uploads/attachment_data/file/413338/Bulk_Data_Transfer_-_additional_validation_valid_from_March_2015.pdf
Não está em nenhuma das respostas anteriores, então eu o publico aqui, caso eles cancelem o link:
UPDATE: Regex atualizado conforme indicado por Jamie Bull. Não tenho certeza se foi meu erro ao copiar ou se houve um erro na regex do governo, o link está desativado agora ...
ATUALIZAÇÃO: Como as ctwheels encontraram, esse regex funciona com o sabor de javascript regex. Veja o comentário dele para um que funcione com o sabor pcre (php).
fonte
^([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})$
deve 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 a diferença ;-)([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})
(removido^
e$
adicionei um?
espaço após) para o regexr.com encontrar mais de um resultado e para os dois encontrarem um resultado que não tenha um separador de espaço.(?:)
e, em seguida, âncoras colocadas em torno dele. Veja isso falhar aqui . Para mais informações, veja minha resposta aqui .^(?:([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}))$
é a expressão regular corrigida.Um post antigo, mas ainda bastante alto nos resultados do google, pensei em atualizar. Este documento de 14 de outubro define a expressão regular do código postal do Reino Unido como:
de:
https://www.gov.uk/government/uploads/system/uploads/attachment_data/file/359448/4__Bulk_Data_Transfer_-_additional_validation_valid.pdf
O documento também explica a lógica por trás dele. No entanto, ele possui um erro (em negrito) e também permite letras minúsculas, o que, embora legal não seja usual, versão alterada:
Isso funciona com novos códigos postais de Londres (por exemplo, W1D 5LH) que versões anteriores não.
fonte
(?:)
e, em seguida, âncoras colocadas em torno dele. Veja isso falhar aqui . Para mais informações, veja minha resposta aqui .^(?:([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}))$
é a expressão regular corrigida.Este é o regex que o Google exibe no domínio i18napis.appspot.com :
fonte
Os códigos postais estão sujeitos a alterações, e a única maneira verdadeira de validar um código postal é ter a lista completa de códigos postais e ver se está lá.
Mas expressões regulares são úteis porque:
Mas expressões regulares tendem a ser difíceis de manter, especialmente para alguém que não a apresentou em primeiro lugar. Então deve ser:
Isso significa que a maioria das expressões regulares nesta resposta não é boa o suficiente. Por exemplo, eu posso ver que
[A-PR-UWYZ][A-HK-Y][0-9][ABEHMNPRV-Y]
isso corresponderá a uma área de código postal no formato AA1A - mas será uma dor de garganta se e quando uma nova área de código postal for adicionada, porque é difícil entender quais áreas de código postal correspondem.Também quero que minha expressão regular corresponda à primeira e à segunda metade do código postal como correspondências entre parênteses.
Então, eu vim com isso:
No formato PCRE, pode ser escrito da seguinte forma:
Para mim, esse é o equilíbrio certo entre validar o máximo possível e, ao mesmo tempo, proteger o futuro e facilitar a manutenção.
fonte
aSW1A 1AAasfg
combinados para mim (eu não downvote embora como parece que poderia ser corrigido facilmente)Eu estive procurando um regex de código postal do Reino Unido nos últimos dias, e me deparei com esse tópico. Eu trabalhei na maioria das sugestões acima e nenhuma delas funcionou para mim. Por isso, criei meu próprio regex que, tanto quanto eu sei, captura todos os códigos postais válidos do Reino Unido a partir de janeiro de 13 (de acordo com a literatura mais recente do Royal Mail).
O regex e algum código postal simples para verificar o código PHP estão publicados abaixo. NOTA: - Permite códigos postais em maiúsculas ou minúsculas e a anomalia do GIR 0AA, mas, para lidar com a presença, mais do que provável, de um espaço no meio de um código postal inserido, ele também usa um simples str_replace para remover o espaço antes do teste contra a regex. Quaisquer discrepâncias além disso e o próprio Royal Mail nem sequer as mencionam em sua literatura (consulte http://www.royalmail.com/sites/default/files/docs/pdf/programmers_guide_edition_7_v5.pdf e comece a ler na página 17) !
Nota: Na literatura do Royal Mail (link acima), há uma pequena ambiguidade em torno da 3ª e 4ª posições e as exceções em vigor se esses caracteres forem letras. Entrei em contato diretamente com o Royal Mail para esclarecê-lo e com suas próprias palavras "Uma carta na 4ª posição do Código de Saída com o formato AANA NAA não tem exceções e as exceções da 3ª posição se aplicam apenas à última letra do Código de Saída com o formato ANA NAA ". Direto da boca do cavalo!
Espero que ajude qualquer pessoa que encontre esse tópico à procura de uma solução.
fonte
SW1A
ouBD25
sem a segunda metade (ou pelo menos o fez para mim)Aqui está uma regex baseada no formato especificado nos documentos que estão vinculados à resposta de marcj:
A única diferença entre isso e as especificações é que os dois últimos caracteres não podem estar em [CIKMOV] de acordo com as especificações.
Edit: Aqui está outra versão que testa as limitações de caracteres à direita.
fonte
A-Z
-Q
nunca é permitido,V
é usado apenas com moderação etc., dependendo da posição do personagem.Algumas das regexs acima são um pouco restritivas. Observe o código postal genuíno: "W1K 7AA" falharia, dada a regra "Posição 3 - AEHMNPRTVXY usada apenas" acima, pois "K" seria proibido.
o regex:
Parece um pouco mais preciso, consulte o artigo da Wikipedia intitulado 'Códigos postais no Reino Unido' .
Observe que esse regex requer apenas caracteres maiúsculos.
A questão maior é se você está restringindo a entrada do usuário para permitir apenas códigos postais que realmente existem ou se você está simplesmente tentando impedir que os usuários digitem lixo completo nos campos do formulário. Combinar corretamente todos os códigos postais possíveis e protegê-los no futuro é um quebra-cabeça mais difícil e provavelmente não vale a pena, a menos que você seja o HMRC.
fonte
veja como lidamos com a questão do código postal do Reino Unido:
Explicação:
Isso obtém a maioria dos formatos e, em seguida, usamos o db para validar se o código postal é realmente real, esses dados são conduzidos pelo ponto aberto https://www.ordnancesurvey.co.uk/opendatadownload/products.html
espero que isto ajude
fonte
AANNA NAA
inválido.Regras básicas:
Os códigos postais no Reino Unido (ou códigos postais, como são chamados) são compostos de cinco a sete caracteres alfanuméricos separados por um espaço. As regras que cobrem quais personagens podem aparecer em posições específicas são bastante complicadas e repletas de exceções. A expressão regular mostrada, portanto, segue as regras básicas.
Regras completas:
Se você precisar de uma regex que marque todas as caixas para as regras de código postal em detrimento da legibilidade, aqui está:
Fonte: https://www.safaribooksonline.com/library/view/regular-expressions-cookbook/9781449327453/ch04s16.html
Testado no banco de dados de nossos clientes e parece perfeitamente preciso.
fonte
Eu uso o seguinte regex que testei em todos os códigos postais válidos do Reino Unido. Ele é baseado nas regras recomendadas, mas é condensado o mais razoável e não faz uso de nenhuma regra regex específica do idioma.
Ele pressupõe que o código postal foi convertido em maiúsculas e não possui caracteres iniciais ou finais, mas aceitará um espaço opcional entre o código externo e a codificação.
O código postal especial "GIR0 0AA" foi excluído e não será validado, pois não está na lista oficial de correios e, tanto quanto sei, não será usado como endereço registrado. Adicioná-lo deve ser trivial como um caso especial, se necessário.
fonte
Eu queria um regex simples, onde é bom permitir muito, mas não negar um código postal válido. Fui com isso (a entrada é uma seqüência de caracteres despojada / aparada):
Isso permite os códigos postais mais curtos possíveis, como "L1 8JQ", e os mais longos possíveis, como "OL14 5ET".
Como ele permite até 8 caracteres, também permitirá códigos postais com 8 caracteres incorretos se não houver espaço: "OL145ETX". Mas, novamente, este é um regex simplista, para quando isso for bom o suficiente.
fonte
Primeira metade do código postal Formatos válidos
Exceções
Posição 1 - QVX não usada
Posição 2 - IJZ não usada, exceto em GIR 0AA
Posição 3 - AEHMNPRTVXY usou apenas a
Posição 4 - ABEHMNPRVWXY
Segunda metade do código postal
Exceções
posição 2 + 3 - CIKMOV não usado
Lembre-se de que nem todos os códigos possíveis são usados; portanto, esta lista é uma condição necessária, mas não suficiente, para um código válido. Pode ser mais fácil corresponder apenas a uma lista de todos os códigos válidos?
fonte
Para verificar se um código postal está em um formato válido, de acordo com o guia do programador do Royal Mail :
Todos os códigos postais do doogal.co.uk correspondem, exceto aqueles que não estão mais em uso.
Adicionando um
?
após o espaço e usando correspondência sem distinção entre maiúsculas e minúsculas para responder a esta pergunta:fonte
Este permite espaços vazios e tabulações de ambos os lados, caso você não queira falhar na validação e, em seguida, apare-o.
fonte
AAA 1AA
não é um formato válido: veja minha resposta para obter uma explicação e correção.Para adicionar a esta lista um regex mais prático que eu uso que permite ao usuário inserir um
empty string
é:Esse regex permite letras maiúsculas e minúsculas com um espaço opcional entre
Do ponto de vista dos desenvolvedores de software, esse regex é útil para softwares em que um endereço pode ser opcional. Por exemplo, se um usuário não quis fornecer seus detalhes de endereço
fonte
Dê uma olhada no código python nesta página:
http://www.brunningonline.net/simon/blog/archives/001292.html
Eu usei para processar códigos postais para mim.
fonte
Nos foi dada uma especificação:
Chegamos a isso:
Mas observe - isso permite qualquer número de espaços entre os grupos.
fonte
Eu tenho o regex para validação de código postal do Reino Unido.
Isso funciona para todo o tipo de código postal interno ou externo
Isso está funcionando para todos os tipos de formato.
Exemplo:
fonte
A resposta aceita reflete as regras dadas pelo Royal Mail, embora haja um erro de digitação no regex. Esse erro de digitação parece estar lá também no site gov.uk (como na página de arquivo XML).
No formato A9A 9AA, as regras permitem um caractere P na terceira posição, enquanto a regex não o permite. O regex correto seria:
Encurtar isso resulta na seguinte expressão regular (que usa a sintaxe Perl / Ruby):
Também inclui um espaço opcional entre o primeiro e o segundo bloco.
fonte
O que encontrei em quase todas as variações e o regex do pdf de transferência em massa e o que está no site wikipedia é este, especificamente para o regex wikipedia, é necessário que haja um ^ após o primeiro | (barra vertical). Eu descobri isso testando o AA9A 9AA, porque, caso contrário, a verificação de formato do A9A 9AA o validará. Por exemplo, a verificação de EC1D 1BB que deve ser inválida volta válida porque C1D 1BB é um formato válido.
Aqui está o que eu criei para uma boa regex:
fonte
Através de testes empíricos e observação, além de confirmar com https://en.wikipedia.org/wiki/Postcodes_in_the_United_Kingdom#Validation , aqui está minha versão de um regex Python que analisa e valida corretamente um código postal do 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})'
Essa regex é simples e possui grupos de captura. Ele não inclui todas as validações de códigos postais legais do Reino Unido, mas leva em consideração apenas as posições das letras versus números.
Aqui está como eu o usaria no código:
Aqui estão os testes de unidade:
fonte
Eu precisava de uma versão que funcionasse no SAS com as
PRXMATCH
funções e relacionadas, então eu vim com isso:Casos de teste e notas:
fonte
O método abaixo verificará o código postal e fornecerá informações completas
fonte