VB .NET - Usando Expressões regulares(Regex)
Eu já escrevi diversos artigos sobre o recurso Regex para saber mais leia os artigos:
Este artigo mostra como usar as expressões regulares para realizar validações.
Em todas as validações a estrutura básica é a mesma e segue o seguinte raciocínio:
1 - Primeiro definimos a expressão regular que será usada para realizar a validação
Dim padraoRegex As String = " expressão regular "
Aqui eu pesquisei na web e encontrei as expressões usadas para as diversas validações.
2 - A seguir criamos uma instância do objeto Regex usando a expressão regular definida
Dim verifica As New RegularExpressions.Regex(padraoRegex, RegexOptions.IgnorePatternWhitespace)
A classe Regex representa o mecanismo para tratar as expressões regulares na plataforma .NET . Ela pode ser usado para analisar rapidamente grandes quantidades de texto para encontrar padrões de caracteres específicos; para extrair, editar, substituir ou excluir substrings de texto, ou para adicionar as strings extraídas a uma coleção para gerar um relatório.
Para usar as expressões regulares, definimos o padrão desejado para identificar em um fluxo de texto usando a sintaxe documentada nos Elementos de linguagem das expressões regulares. A seguir instanciamos um objeto Regex. Finalmente, executamos alguma operação, como a substituição de texto que corresponda ao padrão de expressão regular, ou a identificação de um padrão coincidente.
A enumeração RegexOptions Fornece valores enumerados para usar para definir opções de expressões regulares. Os valores possíveis são:
Valor | Descrição |
None | Especifica que nenhuma opção foi definida |
IgnoreCase | Especifica a comparação case-sensitive |
ExplicitCapture | Especifica que as únicas
capturas válidas são explicitamente nomeadas ou grupos
numerados do formulário (? <name> ...). Isso permite que os parênteses sem nome atuem como grupos de não captura, sem a deselegância sintática da expressão (:? ...). |
Singleline | Especifica modo linha-única. Muda o significado do ponto (.) Para que coincida com todos os caracteres (em vez de cada caractere, exceto \ n). |
IgnorePatternWhitespace | Elimina espaços em branco sem escape do padrão e permite comentários marcados com #. No entanto, o valor IgnorePatternWhitespace não afeta ou elimina o espaço em branco nas classes de caracteres. |
ECMAScript | Permite o comportamento compatível com ECMAScript para a expressão. Este valor pode ser usado apenas em conjunto com os valores IgnoreCase, Multiline, e Compiled. A utilização deste valor com quaisquer outros valores gera uma excepção. |
CultureInvariant | Especifica que as diferenças culturais na linguagem será ignorada. |
Compiled | Especifica que a expressão regular é compilada para um assembly. Isto obtém um rendimento melhor na execução, mas aumenta o tempo de inicialização. Este valor não deve ser atribuído à propriedade Opções ao chamar o método CompileToAssembly. |
Multiline | Modo multilinha. Altera o significado de ^ e $ para que eles correspondam ao início e final, respectivamente, de qualquer linha, e não apenas o início e o fim de toda a cadeia. |
RightToLeft | Especifica que a pesquisa será da direita para a esquerda em vez de da esquerda para a direita. |
Na aplicação exemplos iremos realizar as seguintes validações :
Validação | Expressão Regular |
^[-a-zA-Z0-9][-.a-zA-Z0-9]*@[-.a-zA-Z0-9]+(\.[-.a-zA-Z0-9]+)*\.(com|edu|info|gov|int|mil|net|org|biz|name|museum|coop|aero|pro|tv|[a-zA-Z]{2})$ | |
IP | ^([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])(\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])){3}$ |
Cep | ^\d{5}-\d{3}$ |
Telefone | ^[0-9]{2}-[0-9]{4}-[0-9]{4}$ |
Data (dd/mm/yyyy) | ^((0[1-9]|[12]\d)\/(0[1-9]|1[0-2])|30\/(0[13-9]|1[0-2])|31\/(0[13578]|1[02]))\/\d{4}$ ou ^([0]?[1-9]|[1|2][0-9]|[3][0|1])[./-]([0]?[1-9]|[1][0-2])[./-]([0-9]{4}|[0-9]{2})$ |
URL | ^((http)|(https)|(ftp)):\/\/([\- \w]+\.)+\w{2,3}(\/ [%\-\w]+(\.\w{2,})?)*$ |
CPF | ^(\d{3}.\d{3}.\d{3}-\d{2})|(\d{11})$ ou ^\d{3}\x2E\d{3}\x2E\d{3}\x2D\d{2}$ |
CNPJ | ^\d{3}.?\d{3}.?\d{3}/?\d{3}-?\d{2}$ ou ^\d{2}\.\d{3}\.\d{3}\/\d{4}\-\d{2}$ |
Somente números | ^[0-9]*$ |
^ : Indica o começo da linha. Caso seja omitido esse caractere, será permitida a entrada de qualquer tipo de caractere no início da expressão. Exemplo: w\?;.,io12306, nesse caso seria uma expressão válida.
\d+ : Permite somente
números. A barra invertida escapa o caractere d. Caso
seja omitida, significa que estará permitindo
sucessivamente várias ocorrências da letra d
e não números.
Exemplo: dddd.+: Permite várias ocorrências de um
caractere ou pelo menos uma ocorrência.
$ : indica o final da linha. Caso seja omitido esse caractere, será permitida a entrada de qualquer tipo de caractere no final da expressão. Exemplo:12345we.,?/;t, nesse caso seria uma expressão válida.
[0-9] : Tem o mesmo efeito que \d, ou seja, permite apenas números. O sinal indica a condição de sequência, onde é informado o primeiro e o último caractere da sequência e o sistema se encarrega de mapear o intervalo.
[12]\d: Permite a ocorrência de do caractere 1 ou 2 [12] seguido de um número que pode variar de 0-9.
1[0-2]): Permite a ocorrência do caractere 1 seguido dos caracteres 0, 1, 2. Uma ocorrência por vez.
?: Indica que tudo que estiver depois na expressão é opcional.
.|,: O pipe na expressão tem o significado do ou lógico, ou seja, tanto o que tiver a direita ou a esquerda da expressão pode ocorrer, sendo uma ocorrência por vez
\w: Permite a entrada de qualquer caratere alfanumérico incluindo underscore.
\-: Permite a entrada do caractere -.
\.: Permite a entrada do caractere ..
*: Permite zero ou várias ocorrências de tudo que está a esquerda desse caractere na expressão.
@: Obriga a ocorrência desse caractere na expressão.
+: Permite várias ocorrências de um caractere ou pelo menos uma ocorrência.
Você pode procurar por expressões regulares no link: http://regexlib.com/Search.aspx
Criando o projeto VB .NET
Abra o Visual Basic 2010 Express Edition e no menu File clique em New Project informando o nome ValidarComRegex e no formulário padrão inclua uma Label, uma caixa de Texto, um Button e 9 controles radiobuttons conforme o leiaute da figura abaixo:
A seguir no menu Project clique em Add Class e informe o nome Validar.vb incluindo o código abaixo nesta classe:
Imports System.Text Imports System.Text.RegularExpressions Public Class Validar ''' <param name="email">email para validar</param> ''' <returns>true é valido , false é inválido</returns> Public Shared Function IsValidEmail(ByVal email As String) As Boolean Dim padraoRegex As String = "^[-a-zA-Z0-9][-.a-zA-Z0-9]*@[-.a-zA-Z0-9]+(\.[-.a-zA-Z0-9]+)*\." & _ "(com|edu|info|gov|int|mil|net|org|biz|name|museum|coop|aero|pro|tv|[a-zA-Z]{2})$" Dim verifica As New RegularExpressions.Regex(padraoRegex, RegexOptions.IgnorePatternWhitespace) Dim valida As Boolean = False 'verifica se foi informado um email If String.IsNullOrEmpty(email) Then valida = False Else 'usar IsMatch para validar o email valida = verifica.IsMatch(email) End If 'retorna o valor Return valida End Function Public Shared Function IsValidIP(ByVal ip As String) As Boolean 'cria o padrão regex Dim padraoRegex As String = "^([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])(\." & _ "([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])){3}$" 'cria o objeto Regex Dim verifica As New RegularExpressions.Regex(padraoRegex) 'variavel boolean para tratar o status Dim valida As Boolean = False 'verifica se o recurso foi fornecido If ip = "" Then 'ip invalido valida = False Else 'usa o método IsMatch Method para validar o regex valida = verifica.IsMatch(ip, 0) End If Return valida End Function Public Shared Function isValidCep(ByVal cep As String) As Boolean 'cria o padrão regex Dim padraoRegex As String = "^\d{5}-\d{3}$" Dim verifica As New RegularExpressions.Regex(padraoRegex) 'variavel boolean para tratar o status Dim valida As Boolean = False 'verifica se o recurso foi fornecido If cep = "" Then 'cep invalido valida = False Else 'usa o método IsMatch Method para validar o regex valida = verifica.IsMatch(cep, 0) End If Return valida End Function Public Shared Function isValidSoNumeros(ByVal sonumeros As String) As Boolean 'cria o padrão regex Dim padraoRegex As String = "^[0-9]*$" Dim verifica As New RegularExpressions.Regex(padraoRegex) 'variavel boolean para tratar o status Dim valida As Boolean = False 'verifica se o recurso foi fornecido If sonumeros = "" Then 'cep invalido valida = False Else 'usa o método IsMatch Method para validar o regex valida = verifica.IsMatch(sonumeros, 0) End If Return valida End Function Public Shared Function isValidTelefone(ByVal telefone As String) As Boolean 'cria o padrão regex '^\d{2}-\d{4}-\d{4}$ Dim padraoRegex As String = "^[0-9]{2}-[0-9]{4}-[0-9]{4}$" 'cria o objeto Regex Dim verifica As New RegularExpressions.Regex(padraoRegex) 'variavel boolean para tratar o status Dim valida As Boolean = False 'verifica se o recurso foi fornecido If telefone = "" Then 'telefone invalido valida = False Else 'usa o método IsMatch Method para validar o regex valida = verifica.IsMatch(telefone, 0) End If Return valida End Function Public Shared Function isValidDataDDMMYYYY(ByVal ddmmyyyy As String) As Boolean 'cria o padrão regex Dim padraoRegex As String = "^((0[1-9]|[12]\d)\/(0[1-9]|1[0-2])|30\/(0[13-9]|1[0-2])|31\/(0[13578]|1[02]))\/\d{4}$" Dim verifica As New RegularExpressions.Regex(padraoRegex) 'variavel boolean para tratar o status Dim valida As Boolean = False 'verifica se o recurso foi fornecido If ddmmyyyy = "" Then 'telefone invalido valida = False Else 'usa o método IsMatch Method para validar o regex valida = verifica.IsMatch(ddmmyyyy, 0) End If 'return the results Return valida End Function Public Shared Function isValidUrl(ByVal url As String) As Boolean 'cria o padrão regex Dim padraoRegex As String = "^((http)|(https)|(ftp)):\/\/([\- \w]+\.)+\w{2,3}(\/ [%\-\w]+(\.\w{2,})?)*$" Dim verifica As New RegularExpressions.Regex(padraoRegex) Dim valida As Boolean = False If url = "" Then 'telefone invalido valida = False Else valida = verifica.IsMatch(url, 0) End If Return valida End Function Public Shared Function isValidCNPJ(ByVal cnpj As String) As Boolean Dim padraoRegex As String = "^\d{2}\.\d{3}\.\d{3}\/\d{4}\-\d{2}$" Dim verifica As New RegularExpressions.Regex(padraoRegex) Dim valida As Boolean = False If cnpj = "" Then valida = False Else valida = verifica.IsMatch(cnpj, 0) End If Return valida End Function Public Shared Function ValidarCpf(ByVal cpf As String) As Boolean cpf = cpf.Replace("-", "") cpf = cpf.Replace(".", "") Dim reg As New Regex("(^(\d{3}.\d{3}.\d{3}-\d{2})|(\d{11})$)") If Not reg.IsMatch(cpf) Then Return False End If Dim d1 As Integer, d2 As Integer Dim soma As Integer = 0 Dim digitado As String = "" Dim calculado As String = "" ' Pesos para calcular o primeiro digito Dim peso1 As Integer() = New Integer() {10, 9, 8, 7, 6, 5, 4, 3, 2} ' Pesos para calcular o segundo digito Dim peso2 As Integer() = New Integer() {11, 10, 9, 8, 7, 6, 5, 4, 3, 2} Dim n As Integer() = New Integer(10) {} Dim retorno As Boolean = False ' Limpa a string cpf = cpf.Replace(".", "").Replace("-", "").Replace("/", "").Replace("\", "") ' Se o tamanho for < 11 entao retorna como inválido If cpf.Length <> 11 Then Return False End If ' Caso coloque todos os numeros iguais Select Case cpf Case "11111111111" Return False Case "00000000000" Return False Case "2222222222" Return False Case "33333333333" Return False Case "44444444444" Return False Case "55555555555" Return False Case "66666666666" Return False Case "77777777777" Return False Case "88888888888" Return False Case "99999999999" Return False End Select Try ' Quebra cada digito do CPF n(0) = Convert.ToInt32(cpf.Substring(0, 1)) n(1) = Convert.ToInt32(cpf.Substring(1, 1)) n(2) = Convert.ToInt32(cpf.Substring(2, 1)) n(3) = Convert.ToInt32(cpf.Substring(3, 1)) n(4) = Convert.ToInt32(cpf.Substring(4, 1)) n(5) = Convert.ToInt32(cpf.Substring(5, 1)) n(6) = Convert.ToInt32(cpf.Substring(6, 1)) n(7) = Convert.ToInt32(cpf.Substring(7, 1)) n(8) = Convert.ToInt32(cpf.Substring(8, 1)) n(9) = Convert.ToInt32(cpf.Substring(9, 1)) n(10) = Convert.ToInt32(cpf.Substring(10, 1)) Catch Return False End Try ' Calcula cada digito com seu respectivo peso For i As Integer = 0 To peso1.GetUpperBound(0) soma += (peso1(i) * Convert.ToInt32(n(i))) Next ' Pega o resto da divisao Dim resto As Integer = soma Mod 11 If resto = 1 OrElse resto = 0 Then d1 = 0 Else d1 = 11 - resto End If soma = 0 ' Calcula cada digito com seu respectivo peso For i As Integer = 0 To peso2.GetUpperBound(0) soma += (peso2(i) * Convert.ToInt32(n(i))) Next ' Pega o resto da divisao resto = soma Mod 11 If resto = 1 OrElse resto = 0 Then d2 = 0 Else d2 = 11 - resto End If calculado = d1.ToString() + d2.ToString() digitado = n(9).ToString() + n(10).ToString() ' Se os ultimos dois digitos calculados bater com ' os dois ultimos digitos do cpf entao é válido If calculado = digitado Then retorno = True Else retorno = False End If Return retorno End Function End Class |
A seguir no evento Click do botão de comando Validar inclua o código abaixo:
Public Class Form1 Private Sub btnValidar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnValidar.Click If rdbCEP.Checked Then If Validar.isValidCep(txtDados.Text) Then MessageBox.Show("CEP valido...", "VÁLIDO", MessageBoxButtons.OK, MessageBoxIcon.Information) Else MessageBox.Show("CEP inválido...", "INVÁLIDO", MessageBoxButtons.OK, MessageBoxIcon.Error) End If ElseIf rdbCNPJ.Checked Then If Validar.isValidCNPJ(txtDados.Text) Then MessageBox.Show("CNPJ valido...", "VÁLIDO", MessageBoxButtons.OK, MessageBoxIcon.Information) Else MessageBox.Show("CNPJ inválido...", "INVÁLIDO", MessageBoxButtons.OK, MessageBoxIcon.Error) End If ElseIf rdbCPF.Checked Then If Validar.ValidarCpf(txtDados.Text) Then MessageBox.Show("CPF valido...", "VÁLIDO", MessageBoxButtons.OK, MessageBoxIcon.Information) Else MessageBox.Show("CPF inválido...", "INVÁLIDO", MessageBoxButtons.OK, MessageBoxIcon.Error) End If ElseIf rdbData.Checked Then If Validar.isValidDataDDMMYYYY(txtDados.Text) Then MessageBox.Show("Data valido...", "VÁLIDO", MessageBoxButtons.OK, MessageBoxIcon.Information) Else MessageBox.Show("Data inválido...", "INVÁLIDO", MessageBoxButtons.OK, MessageBoxIcon.Error) End If ElseIf rdbEmail.Checked Then If Validar.IsValidEmail(txtDados.Text) Then MessageBox.Show("Email valido...", "VÁLIDO", MessageBoxButtons.OK, MessageBoxIcon.Information) Else MessageBox.Show("Email inválido...", "INVÁLIDO", MessageBoxButtons.OK, MessageBoxIcon.Error) End If ElseIf rdbFone.Checked Then If Validar.isValidTelefone(txtDados.Text) Then MessageBox.Show("Telefone valido...", "VÁLIDO", MessageBoxButtons.OK, MessageBoxIcon.Information) Else MessageBox.Show("Telefone inválido...", "INVÁLIDO", MessageBoxButtons.OK, MessageBoxIcon.Error) End If ElseIf rdbIP.Checked Then If Validar.IsValidIP(txtDados.Text) Then MessageBox.Show("IP valido...", "VÁLIDO", MessageBoxButtons.OK, MessageBoxIcon.Information) Else MessageBox.Show("IP inválido...", "INVÁLIDO", MessageBoxButtons.OK, MessageBoxIcon.Error) End If ElseIf rdbURL.Checked Then If Validar.isValidUrl(txtDados.Text) Then MessageBox.Show("URL valido...", "VÁLIDO", MessageBoxButtons.OK, MessageBoxIcon.Information) Else MessageBox.Show("URL inválido...", "INVÁLIDO", MessageBoxButtons.OK, MessageBoxIcon.Error) End If ElseIf rdbSoNumeros.Checked Then If Validar.isValidSoNumeros(txtDados.Text) Then MessageBox.Show("dados valido...", "VÁLIDO", MessageBoxButtons.OK, MessageBoxIcon.Information) Else MessageBox.Show("dados inválido...", "INVÁLIDO", MessageBoxButtons.OK, MessageBoxIcon.Error) End If End If End Sub End Class |
O código usado é funcional mas esta longe das melhores práticas. É um código básico, de fácil entendimento e estruturado para iniciantes.
Eu não precisaria repetir o código para validar cada recurso usando métodos distintos poderia criar um método único usando os recursos da orientação a objetos da linguagem VB .NET.
Deixo isso como um exercício para você.
Pegue o projeto completo aqui: ValidarComRegex.zip
Rom 3:10
como está escrito: Não há justo, nem sequer um.Rom 3:11
Não há quem entenda; não há quem busque a Deus.Rom 3:12
Todos se extraviaram; juntamente se fizeram inúteis. Não há quem faça o bem, não há nem um só.Referências:
Super DVD Vídeo Aulas - Vídeo Aula sobre VB .NET, ASP .NET e C#
http://msdn.microsoft.com/en-us/library/system.text.regularexpressions.regexoptions.aspx