Expressões Regulares em Kotlin: Um Guia Completo com Exemplos
Expressões regulares (regex) são uma ferramenta poderosa para buscar, extrair e substituir texto com base em padrões. Em Kotlin, trabalhar com regex é implementado através da classe Regex, que fornece uma API conveniente e compatibilidade total com a implementação Java java.util.regex.Pattern. Neste artigo, abordaremos todos os aspectos do uso de expressões regulares em Kotlin com exemplos claros.
1. Criação e Uso Básico de Regex em Kotlin
Em Kotlin, existem duas maneiras principais de criar uma expressão regular:
- O construtor da classe
Regex— você passa uma string com o padrão. - O método de extensão
.toRegex()— chamado em uma string.
Exemplos de criação:
// Método 1: construtorval regex1 = Regex("\\\\d{3}-\\\\d{2}-\\\\d{4}")
// Método 2: toRegex()val regex2 = "\\\\d{3}-\\\\d{2}-\\\\d{4}".toRegex()
// Com flags (busca sem diferenciar maiúsculas/minúsculas)val regex3 = Regex("hello", RegexOption.IGNORE_CASE)
// Modo multilinhaval regex4 = Regex("^start", RegexOption.MULTILINE)Nota: em Kotlin, assim como em Java, uma barra invertida dupla \\\\ é usada para escapar a barra invertida. Se você escrever \\d, precisa escrever "\\\\d".
2. Principais Funções de Regex: Verificação, Busca, Substituição
A classe Regex fornece várias funções-chave para trabalhar com strings.
2.1. Verificação de Correspondência Total — matches()
A função matches() retorna true se a string inteira corresponder ao padrão.
val emailRegex = Regex("[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\\\.[a-zA-Z]{2,}")
val email1 = "user@example.com"val email2 = "invalid-email"
println(emailRegex.matches(email1)) // trueprintln(emailRegex.matches(email2)) // false2.2. Encontrar a Primeira Correspondência — find()
Retorna a primeira correspondência encontrada como um objeto MatchResult? (ou null se nada for encontrado).
val text = "Meu telefone: 123-45-6789 e também 987-65-4321"val phoneRegex = Regex("\\\\d{3}-\\\\d{2}-\\\\d{4}")
val firstMatch = phoneRegex.find(text)if (firstMatch != null) { println("Telefone encontrado: ${firstMatch.value}") // Telefone encontrado: 123-45-6789 println("Início: ${firstMatch.range.first}") // Início: 14}2.3. Encontrar Todas as Correspondências — findAll()
Retorna uma Sequence<MatchResult> de todas as correspondências não sobrepostas.
val text = "Preços: 100 rub., 250 rub., 50 rub."val priceRegex = Regex("\\\\d+")
val prices = priceRegex.findAll(text)prices.forEach { match -> println("Preço: ${match.value}")}// Saída:// Preço: 100// Preço: 250// Preço: 502.4. Substituição Baseada em Padrão — replace()
A função replace() substitui todas as correspondências encontradas por uma string especificada ou pelo resultado de uma expressão lambda.
val text = "Meu email: john@mail.com e suporte@site.org"val emailRegex = Regex("[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\\\.[a-zA-Z]{2,}")
// Substituição simplesval masked = emailRegex.replace(text, "[EMAIL OCULTO]")println(masked) // Meu email: [EMAIL OCULTO] e [EMAIL OCULTO]
// Substituição com lambda (dinâmica)val replaced = emailRegex.replace(text) { match -> val local = match.value.split("@")[0] "${local.first()}***@***"}println(replaced) // Meu email: j***@*** e s***@***2.5. Dividir uma String — split()
Divide uma string pelas correspondências com a expressão regular.
val text = "maçã,pera;banana|laranja"val separators = Regex("[,;|]")
val fruits = separators.split(text)println(fruits) // [maçã, pera, banana, laranja]