Formatando CPF No SQL Com Expressões Regulares – RegexReplace

Que as expressões regulares são bacanas e divertidas todo mundo já sabe.
Elas estão presentes em várias linguagens e no SQL Server não poderia ser diferente.

Se você é programador e ainda não sabe sobre as expressões regulares, não perca tempo.
Você precisa se emocionar com o uso delas em seus códigos.

Consulte os links abaixo para iniciar já esse aprendizado:
Wikipedia – http://pt.wikipedia.org/wiki/Express%C3%A3o_regular
Um excelente tutorial para começar do Rafael Jaques- http://www.phpit.com.br/artigos/entendendo-as-expressoes-regulares.phpit
Aurélio Marinho Jargas – O guru das expressões regulares – http://aurelio.net/er/

Certo mas e o SQL Server ? Vamos voltar para ele..

Em um post antigo eu mostro como fazer a formatação de campos como CPF direto pelo SQL.

Mas digamos que alguns campos do CPF estejam com formatação correta com pontuação e dígitos e outras não.
E ainda outras mais ou menos. Ex: 161.364.708-53, 16136470853, 161364708-53.
Você tem um problema e nesse caso um SubString não iria funcionar corretamente.

Solução? RegexReplace. Vamos ver como usar isso.

Primeiro vamos montar a expressão regular.
Vamos montar ela de maneira clara pensando apenas em como o CPF tem de ser exibido.
Não vamos pensar no cálculo do dígito verificador nem nada desse tipo.

Bom o que queremos ?

  • 3 números seguidos de um ponto. Vamos lembrar que esse ponto pode existir ou não. Não sabemos como o dado foi salvo no banco.
  • Mais 3 números seguidos de outro ponto. Novamente não sabemos se esse ponto estará presente ou não.
  • Precisamos agora de 3 números seguidos por um hífen, que também não temos certeza se estará lá ou não.
  • Para fechar, dois números.

Legal! Já sabemos o que queremos vamos agora começar a brincadeira.

Não vou explicar aqui cada operador e caracter. Isso é demorado e também não é meu objetivo aqui.
Para começar com Expressões Regulares consulte os links que passei logo no início desse post.

Para trazer numerais na expressão regular usamos o seguinte

[0-9]

Mas isso vai me trazer apenas um numero, mas na verdade queremos 3 então fazemos da seguinte maneira

[0-9]{3}

Se você quisesse 2 números, bastava substituir o 3 pelo 2.

Legal, para pegar os números já temos todas as armas na mão.
E agora os caracteres, o ponto e o hífen opcionais ??
Vamos lá…

O ponto é um operador em expressão regular e não é o operador que vai trazer o que queremos.
Nós precisamos de um ponto literalmente.
Para isso vamos escapar o ponto, assim como escapamos aspas ou caracteres especiais em programação.
Ficando assim:

\.
/*Desconsidere umas das barras, acima
coloquei duas por conta do plugin de sintaxe do wordpress.*/

Agora para deixar isso opcional, basta colocar uma interrogação depois disso.

.?

Para o hífen, não é obrigatório escapar pois ele não é um operador em expressões regulares.
Entretanto eu gosto de escapar ele. Para mim facilita a leitura.

-?

Certo. Temos como pegar os numerais, como pegar hífen e pontos. Agora é juntar tudo.
Vamos usar parênteses para deixar tudo organizado e também para facilitar a nossa formatação mais para frente.

^([0-9]{3}).?([0-9]{3}).?([0-9]{3})-?([0-9]{2})$

Repare que coloquei um circunflexo(^) no início da expressão e um cifrão($) no final.
Isso indica que a String tem que ter um começo e um fim.
Caso não tivesse isso poderia haver qualquer caractere antes ou depois do CPF.

Vejamos por partes então:

  • ^ – Inicia a string
  • ([0-9]{3}) – 3 números
  • .? – Um ponto, que pode ter ou não, por isso a interrogação.
  • ([0-9]{3}) – Novamente 3 números
  • .? – Mais um ponto, que pode ter ou não.
  • ([0-9]{3}) – Mais 3 números
  • -? – Um hífen, que pode ter ou não. Não é obrigatório o escape nele.
  • ([0-9]{2}) – Dois números.
  • $ – Finaliza a String.

Agora vamos para a segunda parte, o RegexReplace do Sql Server.

A função RegexReplace tem 3 parâmetros obrigatórios.
O primeiro é o seu campo, CPF nesse caso. O Segundo a expressão regular, e o terceiro o como queremos exibir.

Os dois primeiros parâmetros já temos.
Para o modo de exibição funciona da seguinte forma.
Quando usamos os parênteses em nossa expressão regular, elas se tornam variáveis que resgatamos com um cifrão e a ordem em que ela aparece na expressão. Então o primeiro parênteses seria o $1, o segundo o $2 e assim por diante.

Agora é só montar a função no Select.
Ficando assim.

Select dbo.RegexReplace('161364.70853',
'^([0-9]{3}).?([0-9]{3}).?([0-9]{3})-?([0-9]{2})',
'$1.$2.$3-$4')

Entre as variáveis você pode colocar os caracteres para exibição como pontos, hífens, underline e qualquer coisa que queira.

Reparem que coloquei o CPF no primeiro parâmetro da função formatado de maneira errada propositalmente.
Experimente modificar essa formatação, deixar só os números, só os pontos, enfim…
Modifique também a exibição da formatação para ver o funcionamento.

É isso galera.

Agradeço ao meu grande brother Anderson Orso por me mostrar possível aprender expressões regulares facilmente.

Espero que tenham curtido.
Qualquer dúvida só mandar.

Abraços!!

UPDATE – 22 de maio

Fala pessoal,
não me dei conta ontem que esqueci um detalhe importantíssimo de todo essa papo aqui.

O RegexReplace e outras funções similares não são nativas no SQL Server ao contrário de outros bancos de dados. Para ter isso disponível nos seus Selects, Updates e etc, você deve compilar um assembly .NET e subir para o banco.

O código para compilar você pode baixar aqui.
Mais detalhes de como fazer e usar tudo isso você encontra nesse link.

Abraço!


Comments