Flávio Silveira Programação & Desenvolvimento

  • BLOG
  • SOBRE
  • PORTFOLIO
  • CONTATO

Formatando CPF no SQL com Expressões Regulares – RegexReplace

May 21st, 2010  |  Published in Banco de Dados, Expressões Regulares, Programação SQL, Programação em geral  |  1 Comment

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!

Compartilhe
  • Print
  • del.icio.us
  • Facebook
  • Google Bookmarks
  • LinkedIn
  • Live
  • MySpace
  • PDF
  • RSS
  • Twitter
  • email

Posts Relacionados

  • Tratando CPF, CNPJ, Primeiro nome e Data pelo SQL (Postgre)
  • Função para contar Palavras (Padrão de caracteres) em uma String Microsoft SQL Server
  • Limitando o SELECT do SQL em diferentes Bancos de Dados

Comentários

Feed
Trackback
  1. Giovanne Smaniotto disse:

    June 2nd, 2010 at 11:19 (#)

    Muito bom.

Deixe um comentário

Flávio Silveira

Programação & Desenvolvimentominha foto

Rss Logo Twitter Logo

Blogroll

  • Aurélio Marinho Jargas
  • Fábio Tomio
  • Mozart Petter
  • Renie Siqueira
  • Willian Rodriguez

Tags & Categorias

add-ons Adobe Air Adobe Flash Builder Adobe Flex Apache apple arrays Banco de Dados CodeIgniter complementos Configuração PHP debug Desenvolvimento Mobile erro 500 erros de servidor Expressões Regulares facilidade formatação via sql Forms framework php geração de cadastros Geração de formulários Internet Explorer não salva session iphone ipod touch Jquery Mobile Layouts mozart petter mozilla firefox multiple site múltiplos sites com codeIgniter Php PHP Sc Conf PodCast postgres Programação em geral reestruturando CodeIgniter Regex Replace Shell Site Mobile smarty SQL Sql Server Template engine Tempo de sessão codeIgniter Adobe (1)
Adobe Air (1)
Adobe Flash Builder (1)
Apache (1)
Banco de Dados (4)
Browsers (2)
CodeIgniter (7)
Expressões Regulares (1)
IPhone – Desenvolvimento (2)
JavaScript (1)
Mobile (1)
Php (10)
Podcast (1)
Programação em geral (12)
Programação SQL (4)
Screencast (1)
Servidor (1)
Shell Script (1)

WP Cumulus Flash tag cloud by Roy Tanck and Luke Morton requires Flash Player 9 or better.



©2010 Flávio Silveira
Powered by WordPress adapted of Gridline Lite of author Graph Paper Press.