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!