1
resposta

[Projeto] Validando CPF

import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("Digite o CPF: ");
String cpf = scanner.nextLine();

    String regex = "^\\d{3}.\\d{3}.\\d{3}-\\d{2}$";
    Pattern pattern = Pattern.compile(regex);
    Matcher matcher = pattern.matcher(cpf);

    if (matcher.matches()){
        System.out.printf("O CPF %s está no formato válido.", cpf);
    }else {
        System.out.printf("O CPF %s está no formato inválido.", cpf);
    }
    scanner.close();
}

}

1 resposta

Olá, Rafael. Como vai?

Parabéns pela conclusão do projeto! A estrutura do seu código Java ficou excelente, o fluxo usando Scanner, Pattern e Matcher está perfeitamente alinhado com as melhores práticas da linguagem para validação de padrões textuais.

A sua expressão regular (Regex) ^\d{3}.\d{3}.\d{3}-\d{2}$ cumpre muito bem o papel básico de checar a quantidade de dígitos do CPF estruturado com pontos e traço. Contudo, do jeito que ela está escrita, existe um pequeno ponto cego conceitual sobre o funcionamento das Regex que vale a pena conhecer.

O Ponto Cego do caractere ponto (.)

Na linguagem das Expressões Regulares, o caractere de ponto final . é um metacaractere especial (um curinga). Ele não significa "um ponto literal", mas sim "qualquer caractere" (pode ser uma letra, um espaço, um traço ou um número).

Isso significa que, com a sua Regex atual, se o usuário digitar 123A456B789-10, o Java dirá que o formato é válido, porque o ponto aceitou as letras A e B.

Para corrigir isso e forçar o Java a aceitar apenas o ponto literal, precisamos "escapar" o caractere usando duas barras invertidas (\\.).

Veja como fica a sua Regex corrigida e totalmente segura:

// O \\. garante que o sistema só aceite um ponto de verdade naquela posição
String regex = "^\\d{3}\\.\\d{3}\\.\\d{3}-\\d{2}$";

Uma evolução para o seu projeto: Aceitar CPF com ou sem pontos

No dia a dia do mercado de trabalho, os usuários costumam digitar o CPF de duas formas: apenas os 11 números (12345678910) ou no formato completo com pontos e traço (123.456.789-10).

Podemos deixar o seu validador muito mais poderoso adicionando o caractere de interrogação ? na Regex. Ele indica que o ponto e o traço são opcionais:

// O ? diz que o separador pode ou não aparecer, mas se aparecer, deve ser o correto
String regex = "^\\d{3}\\.?\\d{3}\\.?\\d{3}-?\\d{2}$";

Próximo passo lógico: Validação Matemática

Lembre-se de que a Regex valida apenas a máscara visual (o formato). Um CPF como 000.000.000-00 passará na Regex, mas não é um CPF real. Na sequência dos seus estudos de Java, o próximo grande desafio será criar a lógica matemática dos dígitos verificadores (os dois últimos números após o traço), que realizam contas de multiplicação e resto de divisão para garantir que o número é de fato autêntico.

Você está no caminho certo e dominando muito bem a sintaxe. Ajuste as barras invertidas do ponto e continue mandando bala nos códigos!

Espero que possa ter lhe ajudado!