1
resposta

[Dúvida] matcher.find() ou matcher.matches()?

Estou em duvida em relação aos metodos .find() e . matches() da classe Matcher.
Não entendi muito bem a diferença edles e qual escolher para usar neste exercicio.

Eu testei os dois, deixei um comentado e rodei o programa, depois comentei o outro e rodei novamente.


package referencia.de.codigo.validando;

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

public class ValidandoReferenciaDeCodigo {
    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);

        System.out.println("Insira o codigo: ");
        String codigo = sc.nextLine();

        Pattern pattern = Pattern.compile("^[A-Z]{3}-\\d{4}$");
        Matcher matcher = pattern.matcher(codigo);

//        boolean valida = matcher.find();

//        if(!valida){
        if(!matcher.matches()){
            System.out.println("Código inválido.");
        }else {
            System.out.println("Código válido.");
        }

        sc.close();
    }
}
1 resposta

Oi, Augusto.

Essa é uma dúvida muito comum quando começamos a trabalhar com a classe Matcher em Java. Embora ambos os métodos sirvam para procurar padrões, eles funcionam com "olhares" diferentes sobre o texto que você está analisando.

A diferença entre matches() e find()

1. matcher.matches():

Este método verifica se a String inteira corresponde exatamente ao padrão definido na sua expressão regular. Ele tenta casar o início, o meio e o fim do texto.

  • Comportamento: É como se ele colocasse uma moldura fixa sobre o texto. Se sobrar qualquer caractere fora do padrão, ele retorna false.
  • Uso ideal: Validações de campos onde o formato deve ser rígido, como CPF, CEP, e-mails ou, no seu caso, o código de referência.

2. matcher.find():

Este método busca por qualquer parte do texto que corresponda ao padrão. Ele varre a String procurando uma ocorrência.

  • Comportamento: Ele vasculha o texto. Se você digitar "O código é ABC-1234", o find() retornará true porque encontrou o padrão ali no meio, enquanto o matches() retornaria false.
  • Uso ideal: Extrair informações de textos longos ou logs, onde você sabe que o padrão existe, mas está misturado com outras palavras.

Qual escolher para o exercício?

Use o matches(). Ele é semanticamente feito para validação total de Strings, o que torna seu código mais legível para outros programadores, indicando que você quer validar o campo inteiro e não apenas "pescar" uma informação lá dentro.

Conteúdos relacionados
Alura Conte com o apoio da comunidade Alura na sua jornada. Abraços e bons estudos!