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"); // falsecontains 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"); // -1indexOf 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://"); // trueEsses 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()); // truePara 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();| Abordagem | Retorna | Use quando |
|---|---|---|
contains | boolean | Pertencimento simples, texto literal |
indexOf | int (posição, ou -1) | Você precisa saber onde está a correspondência |
startsWith / endsWith | boolean | Ancorado no início ou no fim |
Pattern.find | boolean | Padrõ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.
O que aprender com a execução:
contains "brown"imprimetrueecontains "cat"imprimefalse—containsé o teste direto de pertencimento boolean para texto literal.contains "FOX"imprimefalsemesmo que a palavra "fox" esteja presente, provando quecontainsé case-sensitive; a linha normalizadacontains "FOX" (ci)imprimetrue.indexOf "fox"imprime16, a posição inicial baseada em zero da correspondência, enquantoindexOf "bird"imprime-1para sinalizar "não encontrado" — esse-1é o sentinela contra o qual você testa.startsWith "The"eendsWith "dog"ambos imprimemtrue, mostrando as verificações ancoradas lendo o início e o fim da frase.contains ""imprimetrue, 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
- Java Strings — a base para todo método nesta página.
- Java String Methods — a referência completa de
contains,indexOf,startsWithe afins. - How to Compare Strings in Java — igualdade e ordenação, o próximo passo natural após o pertencimento.
- Java Regex: Pattern and Matcher — aprofunde-se na abordagem baseada em padrões mostrada acima.