W3docs

Como Verificar se uma String Contém uma Substring em Java

Verifique substrings em Java com contains, indexOf, startsWith, endsWith e expressões regulares.

Verificar se uma String aparece dentro de outra é uma das tarefas de texto mais comuns em Java. A ferramenta certa depende do que você realmente precisa: uma resposta simples de sim/não, a posição da correspondência, uma verificação ancorada no início ou no fim, ou um padrão flexível. Este capítulo percorre cada abordagem idiomática e quando utilizá-la.

O padrão: String.contains

Quando você precisa apenas de um boolean — "esse fragmento está aqui ou não?" — contains é a escolha mais clara:

String text = "The quick brown fox";
boolean hasFox = text.contains("fox");   // true
boolean hasCat = text.contains("cat");   // false

contains aceita qualquer CharSequence (como String, StringBuilder, etc.) e retorna true se o argumento ocorrer em qualquer posição da string. É case-sensitive: text.contains("FOX") é false. Um caso especial importante a lembrar — a string vazia está contida em toda string, portanto text.contains("") é sempre true.

Quando você precisa da posição: indexOf

contains é implementado internamente sobre indexOf. Se você precisa saber onde uma correspondência começa (ou quer varrer repetições), chame indexOf diretamente:

String text = "The quick brown fox";
int at = text.indexOf("brown");   // 10
int no = text.indexOf("bird");    // -1

indexOf retorna o índice baseado em zero da primeira correspondência, ou -1 quando a substring está ausente. O idioma clássico de pertencimento é text.indexOf("brown") >= 0, que é equivalente a contains, mas também fornece a posição gratuitamente. Há também lastIndexOf para buscar a partir do final, e uma sobrecarga que aceita um deslocamento inicial para encontrar correspondências subsequentes em um laço.

Verificações ancoradas: startsWith e endsWith

Se você se importa especificamente com o início ou o fim de uma string — extensões de arquivo, prefixos de URL, esquemas de protocolo — startsWith e endsWith expressam a intenção diretamente e ficam mais legíveis do que fatiar:

String file = "report.pdf";
boolean isPdf  = file.endsWith(".pdf");      // true
boolean isHttp = "https://w3docs.com".startsWith("https://"); // true

Esses métodos são mais rápidos e mais claros do que indexOf(prefix) == 0, pois param de comparar assim que um caractere difere e nunca varrem a string inteira.

Comparação sem diferenciação de maiúsculas e correspondência por padrão

contains não possui uma sobrecarga sem diferenciação de maiúsculas e minúsculas. A correção mais simples é normalizar os dois lados:

boolean ci = text.toLowerCase().contains("FOX".toLowerCase()); // true

Para mais do que um fragmento literal — alternativas, curingas, limites de palavras — use uma expressão regular. Pattern.compile(...).matcher(text).find() retorna true se o padrão corresponder em qualquer lugar, e CASE_INSENSITIVE lida com maiúsculas e minúsculas sem alocar cópias em minúsculas:

import java.util.regex.Pattern;
boolean found = Pattern.compile("fox", Pattern.CASE_INSENSITIVE)
                       .matcher(text).find();
AbordagemRetornaUse quando
containsbooleanPertencimento simples, texto literal
indexOfint (posição, ou -1)Você precisa saber onde está a correspondência
startsWith / endsWithbooleanAncorado no início ou no fim
Pattern.findbooleanPadrões, alternativas, sem distinção de maiúsculas

Um exemplo prático

Este programa executa as quatro abordagens lado a lado em uma frase, incluindo o problema de sensibilidade a maiúsculas e o caso especial da string vazia.

java— editable, runs on the server

O que aprender com a execução:

  • contains "brown" imprime true e contains "cat" imprime falsecontains é o teste direto de pertencimento boolean para texto literal.
  • contains "FOX" imprime false mesmo que a palavra "fox" esteja presente, provando que contains é case-sensitive; a linha normalizada contains "FOX" (ci) imprime true.
  • indexOf "fox" imprime 16, a posição inicial baseada em zero da correspondência, enquanto indexOf "bird" imprime -1 para sinalizar "não encontrado" — esse -1 é o sentinela contra o qual você testa.
  • startsWith "The" e endsWith "dog" ambos imprimem true, mostrando as verificações ancoradas lendo o início e o fim da frase.
  • contains "" imprime true, o lembrete de que toda string contém a string vazia — proteja-se contra entradas vazias se isso puder ser um bug.

Tópicos relacionados

Prática

Prática
O que text.indexOf('bird') retorna quando 'bird' não está presente na string text?
O que text.indexOf('bird') retorna quando 'bird' não está presente na string text?
Was this page helpful?