A plataforma .NET e as Expressões Regulares
A Microsoft .NET Framework vem com um poderoso mecanismo de expressões regulares que é acessível a qualquer linguagem da plataforma: VB.NET, C#, etc. |
Uma expressão regular ou regex para simplificar, é um modelo que descreve uma certa quantidade de texto. A expressão regular mais simples consiste de um único caractere. Ex: a. Este padrão irá coincidir com a primeira ocorrência do caractere em uma string. Se a string for "Isto é apenas um teste" a primeira ocorrência será a letra a antes da letra p (de apenas).
As expressões regulares possuem 11 caracteres especiais conhecidos como meta caracteres, são eles:
Para usar qualquer um destes caracteres como um literal em uma expressão regular temos que usar um caractere de escape (\). Assim se você deseja escrever 1+1=2 deverá usar 1 \+ 1=2 de outra forma o caractere + terá um significado especial.
Regex é a classe mais importante deste grupo e qualquer código para um expressão regular instancia pelo menos um objeto desta classe ( ou usar um dos métodos estáticos da classe Regex). Você instancia este objeto passando o padrão de critério escrito no formato especial da linguagem usada para expressão regulares. No exemplo a seguir a expressão regular define qualquer grupo de dois caracteres consistindo de uma vogal seguida por um dígito:
Dim re As New Regex("[aeiou\d")
O método de localização do objeto Regex aplica a expressão regular a string passada como argumento; e retorna um objeto do tipo MatchCollection, uma coleção somente-leitura que representa todas as ocorrências coincidentes com o critério usado.
No exemplo abaixo estamos aplicando a expressão regular definida acima a um texto e obtendo o número de coincidências obtidas:
Para testar o código abaixo crie um novo projeto do tipo Windows forms e inclua no formulário padrão uma caixa de texto. Lembrando que para ter acesso a classe Regex devemos usar o namespace : System.Text.RegularExpressions
Imports System.Text.RegularExpressions Public Class Form1 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Dim re As New Regex("[aeiou]\d") ' Esta string contém 3 gupors que coincidem com a expressão regular definida Dim text As String = "a1 = a1 & e2" ' Obtém a coleção de coincidências Dim mc As MatchCollection = re.Matches(text) ' Obtendo o número de ocorrências encontradas txtRegex.Text = mc.Count End Sub End Class |
Você também pode passar um segundo argumento ao método Matches o qual será interpretado com um índice onde a procura inicia.
O objeto MathCollection contém objetos Match individuais os quais expõe propriedades como Value (indicando a string que foi encontrada) , index ( indicando a posição da string no texto) e Length ( o comprimento da string coincidente) .
No exemplo abaixo expandimos o exemplo dado anteriormente para exibir além da quantidade de ocorrências o valor da string coincidente e a posição inicial de localização no texto:
Imports System.Text.RegularExpressions Public Class Form1 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Dim re As New Regex("[aeiou]\d") ' Esta string contém 3 gupors que coincidem com a expressão regular definida Dim text As String = "a1 = a1 & e2" ' Obtém a coleção de coincidências Dim mc As MatchCollection = re.Matches(text) ' Obtendo o número de ocorrências encontradas txtRegex.Text = "Quantidade de ocorrências = " & mc.Count & vbCrLf For Each m As Match In mc ' Exige o texto e posição txtRegex.Text += "Texto = " & m.Value & " na posicao = " & m.Index & vbCrLf Next End Sub End Class |
|
O objeto Regex também é capaz de modificar a string fonte pela busca de uma dada expressão regular e substituindo-a por um outro valor através da utilização do método Replace:
Private Sub Button1_Click(ByVal sender As
System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim texto As String = "a1 = a1 & e2" txtRegex.Text = "Texto inicial => " & texto & vbCrLf ' busca pelo caractere "a" seguido por um digito Dim re2 As New Regex("a\d") ' elimina o digito que segue o caractere "a" Dim res As String = re2.Replace(texto, "a") txtRegex.Text += "Texto alterado => " & res End Sub |
|
A classe Regex também expõe versões estáticas dos métodos : Match, Matches e Replace. Você pode usar os métodos estáticos quando você não instanciar um objeto Regex explicitamente:
O código a seguir é equivalente ao usando anteriormente mas não instância um objeto Regex. res = Regex.Replace(texto, "a\d", "a")
Podemos usar as expressões regulares para efetuar validações em diversos níveis, até em instruções SQL para evitar o ataque de injeção SQL. Abaixo um exemplo básico para as principais instruções SQL:
Instrução | Expressão Regular de Validação da consulta SQL |
Select |
SELECT\s[\w\*\)\(\,\s]+\sFROM\s[\w]+ |
Update |
UPDATE\s[\w]+\sSET\s[\w\,\'\=]+ |
Insert |
INSERT\sINTO\s[\d\w]+[\s\w\d\)\(\,]*\sVALUES\s\([\d\w\'\,\)]+ |
Delete |
DELETE\sFROM\s[\d\w\'\=]+ |
Nota: Para saber mais sobre injeção SQL leia o artigo : Previna-se contra a injeção SQL.
A seguir é apresentada uma tabela contendo alguns caracteres e expressões usadas na linguagem das expressões regulares:
Sequencia | Descrição |
---|---|
\a | Caractere de alarme (\x07). |
\b | O backspace ou retrocesso(\x08) |
\t | O caractere tab (\x09). |
\r | O carriage return ou retorno( \x0D). |
\v | O tab vertical (\x0B). |
\f | O form-feed ou alimentador de formulario(\x0C). |
\n | O caractere nova linha (\x0A). |
\e | O caractere scape ( \x1B). |
\040 | Um caractere ASCII expresso na notação octal |
\x20 | Um caractere ASCII expresso na notação hexadecimal |
\cC | Um caractere de controle ASCII . Exemplo: \cC =>control+C. |
\u0020 | Um caractere Unicode na notação hexadecimal: Ex:: \u0020 é um espaço. |
\* | Quando uma barra invertida for seguida por um caractere que não é de escape ele é o caractere de critério usado na expressão. Ex:: \* usa como critério o caractere * |
. | O caractere ponto coincide com qualquer caractere exceto com o o caractere de nova linha. |
[aeiou] | Qualquer caractere na lista entre os parênteses ([]) que coincidirem com qualquer uma das vogais. |
[^aeiou] | Qualquer caractere exceto aqueles definidos entre os parênteses ([]), ou seja, exceto as vogais. |
[azAZ] | O traço permite a você definir intervalo de caracteres: [azAZ] coincide com qualquer caractere minúsculo ou maiúsculo entre a e z.; [^09] coincide qualquer caractere não digito. |
\w | Um caractere alfanumérico ou um caractere de sublinhado; o mesmo que [a-zA-Z_0-9] mas inclui também caracteres acentuados e outros símbolos alfabéticos. |
\s | Um caractere de espaço em branco,o qual pode ser um space, um tab, um form-feed, um newline, um carriage ; o mesmo que [ \f\n\r\t\v]. |
\S | Um caractere diferente de um espaço em branco; o mesmo que [^ \f\n\r\t\v]. |
\d | Um digito decimal; o mesmo que [0-9]. |
\D | Um caractere não numérico; o mesmo que [^0-9]. |
^ | O inicio da string. |
$ | O final de uma string |
\A | O inicio de uma string |
\Z | O final de uma string ou a posição antes do caractere de nova linha no final da string. |
\z | Exatamente o fim da string |
\G | A posição na qual a busca atual inicia. |
* | Nenhuma ou mais coincidências. |
+ | Uma ou mais coincidências. |
? | Zero ou uma coincidência; |
{N} | Exatamente N coincidências; |
{N,} | No mínimo N coincidências; |
{N,M} | Entre N e M coincidências; |
$_ | Substitui a toda a string fonte. |
Aguarde em breve mais artigos sobre Expressões Regulares na plataforma .NET.
Até o próximo artigo...
Referências:
Super DVD Vídeo Aulas - Vídeo Aula sobre VB .NET, ASP .NET e C#
.NET - Ferramentas de Produtividade : Expresso - Tratando expressões regulares