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\'\=]+

Fonte: MSDN-Magazine

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.
[a–zA–Z] O traço permite a você definir intervalo de caracteres: [a–zA–Z] coincide com qualquer caractere minúsculo ou maiúsculo entre a e z.; [^0–9] 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:


José Carlos Macoratti