regex para código postal

118

Possível duplicata:
Qual é o código postal e zip regex definitivos?

Preciso do Regex, que pode satisfazer todas as minhas três condições para código postal. Por exemplo-

  1. 12345
  2. 12345-6789
  3. 12345 1234

Quaisquer dicas e sugestões seriam muito apreciadas. Obrigado !

Shaitender Singh
fonte
4
O fechamento duplicado parece incompleto - o idiota está pedindo uma regex que corresponda a qualquer código postal de qualquer nação, enquanto esta pergunta está pedindo uma regex que corresponda aos CEPs, que são exclusivos dos EUA, o que torna essa pergunta muito de âmbito mais restrito do que o dupe - mas não é , de facto, uma resposta a ser encontrada no dupe. Consulte stackoverflow.com/a/7185241/1709587 que lista as regexes de código postal Unicode CLDR (antigo, agora obsoleto, mas provavelmente ainda adequado em muitos casos) para> 100 países, incluindo os EUA. O regex dos EUA é \d{5}([ \-]\d{4})?.
Mark Amery,

Respostas:

310
^\d{5}(?:[-\s]\d{4})?$
  • ^ = Início da string.
  • \d{5} = Corresponde a 5 dígitos (para condição 1, 2, 3)
  • (?:…) = Agrupamento
  • [-\s] = Corresponde a um espaço (para a condição 3) ou um hífen (para a condição 2)
  • \d{4} = Corresponder 4 dígitos (para condição 2, 3)
  • …? = O padrão antes dele é opcional (para condição 1)
  • $ = Fim da string.
Kennytm
fonte
7
\scorresponderá a qualquer espaço em branco, incluindo guias e novas linhas.
ausência de pálpebras,
1
Olá, e a condição 123451234 sem espaço
Ajay Suwalka,
4
@ProVega: Lendo os comentários sobre a resposta (agora excluída) que você vinculou, parece estar incorreta. Por exemplo, 00544é um código postal válido; 544não é.
Keith Thompson
2
@AjaySuwalka: Tudo o que você teria que fazer para acomodar o 123451234 sem espaço é colocar um? depois de [- \ s], então se tornaria: ^ \ d {5} (?: [- \ s]? \ d {4})? $
Grungondola
6
Um pouco atrasado para a festa e talvez não seja o sino mais bonito do baile, mas acrescentei espaços opcionais adicionais em cada lado do hífen - principalmente para a estética. /(^\d{5}(?:[\s]?[-\s][\s]?\d{4})?$)/
Birrel
4

Para as três condições listadas apenas, essas expressões podem funcionar também:

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

Consulte esta demonstração para obter explicações adicionais.

Se tivéssemos espaços adicionais inesperados entre 5 e 4 dígitos ou um código postal contínuo de 9 dígitos, como:

123451234
12345 1234
12345  1234

esta expressão, por exemplo, seria uma opção secundária com menos restrições:

^\d{5}([-]|\s*)?(\d{4})?$

Consulte esta demonstração para obter explicações adicionais.

Circuito RegEx

jex.im visualiza expressões regulares:

insira a descrição da imagem aqui

Teste

const regex = /^\d{5}[-\s]?(?:\d{4})?$/gm;
const str = `12345
12345-6789
12345 1234
123451234
12345 1234
12345  1234
1234512341
123451`;
let m;

while ((m = regex.exec(str)) !== null) {
    // This is necessary to avoid infinite loops with zero-width matches
    if (m.index === regex.lastIndex) {
        regex.lastIndex++;
    }
    
    // The result can be accessed through the `m`-variable.
    m.forEach((match, groupIndex) => {
        console.log(`Found match, group ${groupIndex}: ${match}`);
    });
}

Emma
fonte
0

Sei que isso pode ser óbvio para a maioria das pessoas que usam RegEx com frequência, mas no caso de algum leitor ser novo no RegEx, achei que deveria apontar uma observação que fiz que foi útil para um de meus projetos.

Em uma resposta anterior de @kennytm:

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

…? = O padrão antes dele é opcional (para condição 1)

Se você deseja permitir códigos postais padrão de 5 dígitos e +4, este é um ótimo exemplo.

Para corresponder apenas aos códigos postais no formato 'Zip + 4' dos EUA, conforme eu precisava fazer (apenas as condições 2 e 3), basta remover o último ?para que ele sempre corresponda ao último grupo de 5 caracteres.

Uma ferramenta útil que recomendo para mexer com RegEx está no link abaixo:

https://regexr.com/

Eu uso essa ferramenta com frequência quando encontro o RegEx que faz algo semelhante ao que eu preciso, mas poderia ser um pouco melhor adaptado. Ele também possui um menu de referência RegEx bacana e uma interface informativa que o mantém ciente de como suas alterações afetam as correspondências para o texto de amostra inserido.

Se eu errar ou perder uma informação importante, corrija-me.

NjalTheKnut
fonte
ou você pode consultar este tutorial regex - youtube.com/watch?v=8uCHRyK_VMo
Krishnraj Rana