Expressões Regulares códigos diversos

Expressões Regulares códigos diversos

12 de outubro de 2020 0 Por Ramos de Souza Janones
Como vender Software - Seja desktop, web ou MobilePowered by Rock Convert
Powered by Rock Convert

Expressões Regurares, ou regex, para: validação de e-mail, CPF, CNPJ, bandeiras de cartão de crédito e diversos exemplos para melhorar seus aplicativos.

Validações de Expressões regulares, regex, para:

Lista de validações regex para os mais diversos tipos de linguagens de programação:

Expressões regulares de Bandeiras de cartão de crédito

Validar cartçao de cpredito e identificar suas bandeiras são fundamentais, em: https://gist.github.com/erikhenrique/5931368

American Express:: '^3[47]\d{0,13}'
Aura: '^507860'
Banese Card: '^636117'
Cabal: '(60420[1-9]|6042[1-9][0-9]|6043[0-9]{2}|604400)'
Diners: '(36[0-8][0-9]{3}|369[0-8][0-9]{2}|3699[0-8][0-9]|36999[0-9])
Fort Brasil: '^628167'
GrandCard: '^605032'
Hipercard: '^606282|^637095|^637599|^637568'
Personal Card: '^636085'
Sorocred: '^627892|^636414'
Valecard: '^606444|^606458|^606482'
Elo: ^4011(78|79)|^43(1274|8935)|^45(1416|7393|763(1|2))|^504175|^627780|^63(6297|6368|6369)|(65003[5-9]|65004[0-9]|65005[01])|(65040[5-9]|6504[1-3][0-9])|(65048[5-9]|65049[0-9]|6505[0-2][0-9]|65053[0-8])|(65054[1-9]|6505[5-8][0-9]|65059[0-8])|(65070[0-9]|65071[0-8])|(65072[0-7])|(65090[1-9]|6509[1-6][0-9]|65097[0-8])|(65165[2-9]|6516[67][0-9])|(65500[0-9]|65501[0-9])|(65502[1-9]|6550[34][0-9]|65505[0-8])|^(506699|5067[0-6][0-9]|50677[0-8])|^(509[0-8][0-9]{2}|5099[0-8][0-9]|50999[0-9])|^65003[1-3]|^(65003[5-9]|65004\d|65005[0-1])|^(65040[5-9]|6504[1-3]\d)|^(65048[5-9]|65049\d|6505[0-2]\d|65053[0-8])|^(65054[1-9]|6505[5-8]\d|65059[0-8])|^(65070\d|65071[0-8])|^65072[0-7]|^(65090[1-9]|65091\d|650920)|^(65165[2-9]|6516[6-7]\d)|^(65500\d|65501\d)|^(65502[1-9]|6550[3-4]\d|65505[0-8])

Vai gostar tambem:

Expressões regulares para validar um campo que aceita CPF ou CNPJ

Esta solução valida estes formatos: 00000000000, 00000000000000, 000.000.000-00, 00.000.000/0000-00 e até 000000000-00 ou 00000000/0000-00, por exemplo. Os pontos e traços são opcionais em cada uma das posições.

O que não é aceito, por exemplo: 000-000-000-00 (mas pode ser alterado conforme nota abaixo)

Regex:

([0-9]{2}[\.]?[0-9]{3}[\.]?[0-9]{3}[\/]?[0-9]{4}[-]?[0-9]{2})|([0-9]{3}[\.]?[0-9]{3}[\.]?[0-9]{3}[-]?[0-9]{2})

Clique aqui e faça seus testes em realtime no regexpal.

Explicação:

  • [0-9]{2} Faixa de caracteres: 0 a 9, quantidade: 2 caracteres;
  • [0-9]{3} Faixa de caracteres: 0 a 9, quantidade: 3 caracteres;
  • [0-9]{4} Faixa de caracteres: 0 a 9, quantidade: 4 caracteres;
  • [\.]?Um ponto, opcional. Foi usado \ no ponto, pois ele sozinho é caractere especial;
  • [-]? Um traço, opcional (se acrescentar outros caracteres, comece pelo – sempre);
  • [\/]? Uma barra, opcional. Tambem “escapada” com \ pra agradar o PCRE;
  • (grupo1)|(grupo2) Se um dos grupos validar, a expressão é válida.

Caso queira aceitar outros separadores, basta acrescentar entre os [ ].
Exemplo: [-\.\/]? vai aceitar tanto - quanto . e / naquela posição (? = ou nada).

Para adaptar para outros “dialetos” de regexp, algumas variações possíveis seriam tirar o escape da barra (\/ => /) e opcionalmente colocar um ^ no começo e um $ no fim da linha.

Expressão regular para validar um campo que aceita CPF ou CNPJ (sem cálculo dos dígitos verificadores):

/^([0-9]{3}\.?[0-9]{3}\.?[0-9]{3}\-?[0-9]{2}|[0-9]{2}\.?[0-9]{3}\.?[0-9]{3}\/?[0-9]{4}\-?[0-9]{2})$/

Ela pode ser entendida assim (onde “cpf” é a expressão para validar CPF e “cnpj” é a expressão para validar CNPJ):

/^(cpf|cnpj)$/

As barras inicial e final (/) não fazem parte da expressão propriamente dita – são apenas delimitadores. O caracter ^ no começo e o caracter $ no final exigem que o conteúdo completo do string a ser validado corresponda à expressão entre os mesmos. Os parênteses contendo a barra vertical (a|b) criam uma “opção” alternativa entre “a” e “b“. Satisfazendo qualquer uma das duas expressões, o resultado será positivo. No lugar de “a” e “b“, temos então as expressões específicas para CPF e CNPJ, separadamente.

Para CPF:

[0-9]{3}\.?[0-9]{3}\.?[0-9]{3}\-?[0-9]{2}

A interrogação (?) faz com que a especificação de caractere precedente seja opcional. Portanto os pontos e o tracinho são opcionais. A classe de caracteres [0-9] representa qualquer caracter de  a 9 (poderíamos usar \d, mas eu prefiro [0-9] por ser mais legível). Finalmente, o número entre colchetes ({3}) determina uma quantidade específica de vezes que a especificação de caractere precedente deve se repetir. Assim sendo, são requeridos no total 11 caracteres numéricos (3 + 3 + 3 + 2).

Powered by Rock Convert

Para CNPJ, a estrutura é semelhante:

[0-9]{2}\.?[0-9]{3}\.?[0-9]{3}\/?[0-9]{4}\-?[0-9]{2}

Aqui são requeridos no total 14 caracteres numéricos (2 + 3 + 3 + 4 + 2).

LEIA TAMBÉM:  Criando um local de trabalho ágil

Lembrando que a barra invertida (\) antes do ponto (.) e outros caracteres especiais é um caracter de “escape”, que serve para desconsiderar a interpretação especial do caractere seguinte e considerá-lo literalmente. (O ponto, sem “escape”, significa “qualquer caractere”. Com “escape”, significa meramente o caractere “ponto” mesmo.)


Para saber se é CPF ou CNPJ

No lado do servidor, em PHP, é feita a seleção entre CPF ou CNPJ considerando o número de dígitos presentes no campo:

$numeros = preg_replace('/[^0-9]/', '', $valor);

if (strlen($numeros) == 11)
{
    $cliente->cpf = $valor;
}
elseif (strlen($numbers) == 14)
{
    $cliente->cnpj = $valor;
}

Observação: isso não substitui a validação feita pela expressão regular que vimos acima, a qual também é realizada no lado do servidor (no meu caso as regras estão embutidas no modelo, com as mesmas expressões regulares de validação que vimos acima para CPF e CNPJ, só que separadas – cada qual em seu respectivo campo).

Expressões regulares para validar uma string contendo apenas letras, espaços em branco e letras com acento

Exemplo:

Validar um input text para nome completo a fim de aceitar apenas letras, espaços em branco e letras com acento.

Formatos válidos:

Leandro Moreira  
leandro moreira  
Kézia Maria  
kezia maria  
Cabaço da silva  
Cabaço da Silva

Esse regex não pode aceitar caracteres especiais fora letras com acento.

Resposta:

Se o alvo são apenas os acentos comuns em português, fica fácil listá-los um a um. Eu faria uma regex com os seguintes blocos:

  • A-Za-z maiúsculas e minúsculas sem acento
  • áàâãéèêíïóôõöúçñ: vogais acentuadas do português, cedilha e umas outras de lambuja, minúsculas
  • ÁÀÂÃÉÈÊÍÏÓÔÕÖÚÇÑ: vogais acentuadas do português, cedilha e umas outras de lambuja, maiúsculas
  • espaços

Portanto:

/^[A-Za-záàâãéèêíïóôõöúçñÁÀÂÃÉÈÍÏÓÔÕÖÚÇÑ ]+$/

Ou, deixando a distinção minúsculas/maiúsculas para a implementação:

/^[a-záàâãéèêíïóôõöúçñ ]+$/i

Demo (desta segunda opção)

Expressões regulares para a Validação de E-mails

Dificuldades na Validação de E-mails

Validar e-mails com RegEx, ainda mais via Javascript, pode ser uma faca de dois gumes. E-mails válidos podem ser rejeitados e inválidos podem ser aceitos na maioria das expressões usadas comumente nos sites mundo afora.

Por outro lado, é importante entender que não é necessário, nem é recomendável, validar um e-mail muito rigidamente, afinal somente saberemos se ele é verdadeiramente válido quando enviarmos um e-mail para o endereço em questão.

LEIA TAMBÉM:  BITBUCKET – REPOSITÓRIO ON-LINE GRÁTIS

Uma discussão interessante sobre validação de e-mail pode ser encontrada neste link.

Validação de e-mail com Regex

Uma expressão regular que valida adequadamente um e-mail de acordo com a definição oficial de e-mails pode ser encontrada neste link. Entretanto, ela é muito complexa e provavelmente não suportada pelas engines de Javascript.

Uma simplificação pode ser encontrada no artigo citado anteriormente (primeiro link), que seria:

/[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?/gi

Veja o jsfiddle.

Note que o sufixo /gi ao final. O i faz com que e-mails com letras maiúsculas e minúsculas sejam aceitos. O g faz com que a expressão verifique a String como um todo. Sem o g, um e-mail como zignd.igor@gmail.com zignd.igor@gmail.com seria aceito.

Ajustando a Expressão Regular

Quanto à expressão original da pergunta, um pequeno ajuste faria ela funcionar:

/^[a-z0-9.]+@[a-z0-9]+\.[a-z]+(\.[a-z]+)?$/i

Note que o último parêntesis aberto está agora antes do último caractere de ponto final, que também deve ser opcional. Por outro lado, esta expressão terá muitos falsos-positivos. A expressão anterior é mais adequada.

Veja o jsfiddle.

Conclusão

A expressão regular proposta na pergunta pode ser facilmente corrigida, mas ela inviabilizará e-mails válidos de serem aceitos. A outra expressão citada mais acima é mais recomendada. Embora e-mails como teste@gmail.com.br.br sejam aceitos, eles são, em teoria, perfeitamente válidos.

Validação de telefiones e celulares

^\([1-9]{2}\) [9]{,1}[6-9]{1}[-9]{3}\-[0-9]{4}$

Explicação:

  • ^ = Início da string.
  • \( = Um abre parênteses.
  • [1-9]{2} = Dois dígitos de 1 a 9. Não existem códigos de DDD com o dígito 0.
  • \) = Um fecha parênteses.
  • = Um espaço em branco.
  • [9]{0,1} = O primeiro dígito é 9, mais ele pode ou não existir daí o “0” ou “1” dentro da {0,1}.
  • [6-9]{1} = o segundo dígito pode ser de 6 à 9.
  • [0-9]{3} = Os três outros dígitos são de 0 à 9
  • \- = Um hífen.
  • [0-9]{4} = A segunda metade do número do telefone.
  • $ = Final da string.

Pegar texto até determinada sequência de caracteres

Use essa regex:

((.|\n)*?)(a\).*?)\n*?(b\).*?)\n*?(c\).*?)\n*?(d\).*?)\n*?(e\).*?)$|\n*?

Ela irá separar o texto em grupos sendo que:

  • Grupo 1 – Contém o texto antes da opção a).
  • Grupo 2 – Não captura nada, porém encapsula as opções de captura do grupo 1.
  • Grupo 3 – Contém o conteúdo da opção a até a quebra de linha (onde começaria a opção b no seu exemplo).
  • Grupo 4 – Contém o conteúdo da opção b até a quebra de linha.
  • Grupo 5 – Contém o conteúdo da opção c até a quebra de linha.
  • Grupo 6 – Contém o conteúdo da opção d até a quebra de linha.
  • Grupo 7 – Contém o conteúdo da opção e até a quebra de linha ou fim do texto.
LEIA TAMBÉM:  Conhecendo os super poderes dos comandos Git e GitHub

Você pode ver o funcionamento dessa regex aqui

Explicação da regex

((.|\n)*?) – Vai capturar qualquer caractere e quebra de linha do conteúdo até que chegue o primeiro delimitador.

(a\).*?)\n*? – a\) é igual a a) e ele será usado como um delimitador, para que o primeiro grupo de captura pare de capturar na primeira ocorrência da sequencia a), após isso a regex irá capturar todo o conteúdo até a primeira quebra de linha.

(b\).*?)\n*? – O funcionamento desse grupo de captura é igual ao do grupo 3, só que captura a partir do b).

(c\).*?)\n*? – O funcionamento desse grupo de captura é igual ao do grupo 3, só que captura a partir do c).

(d\).*?)\n*? – O funcionamento desse grupo de captura é igual ao do grupo 3, só que captura a partir do d).

(e\).*?)\$|\n*? – O funcionamento desse grupo de captura é igual ao do grupo 3, só que captura a partir do e)e para no fim do texto ou em uma quebra de linha, pro caso de você usar essa regex em um arquivo que possua muitas questões e textos.

Você está na seção: » Programação

Powered by Rock Convert
Siga os bons!
Últimos posts por Ramos de Souza Janones (exibir todos)
vote
Article Rating