Expressões Regulares em Kotlin: do Básico às Técnicas Avançadas
Expressões regulares (regex) são uma ferramenta poderosa para buscar, extrair e substituir texto com base em padrões. Em Kotlin, o trabalho com expressões regulares é implementado através da classe Regex, que fornece uma API rica para todas as operações padrão. Neste artigo, abordaremos a sintaxe, as funções principais e exemplos práticos de uso de expressões regulares em Kotlin.
1. Criação e sintaxe básica de Regex em Kotlin
Em Kotlin, uma expressão regular é criada usando a classe Regex ou através da extensão .toRegex() para strings. Todos os metacaracteres e quantificadores padrão são suportados.
Formas de criar Regex:
// Forma 1: através do construtorval regex = Regex("\\\\d{3}-\\\\d{2}-\\\\d{4}")
// Forma 2: através de toRegex()val pattern = "[a-z]+@[a-z]+\\\\.[a-z]+".toRegex()
// Forma 3: com opções (insensível a maiúsculas/minúsculas)val caseInsensitive = Regex("kotlin", RegexOption.IGNORE_CASE)Principais metacaracteres e quantificadores:
.— qualquer caractere (exceto quebra de linha)\\d— dígito (0-9)\\w— letra, dígito ou sublinhado\\s— caractere de espaço em branco^— início da string$— fim da string*— 0 ou mais repetições+— 1 ou mais repetições?— 0 ou 1 repetição{n,m}— de n a m repetições
2. Operações principais: busca, verificação e extração
A classe Regex fornece vários métodos para trabalhar com texto. Vamos analisar os mais importantes.
Verificação de correspondência (matches)
O método matches() verifica se toda a string corresponde completamente ao padrão:
val phonePattern = Regex("\\\\+7\\\\d{10}")println(phonePattern.matches("+79261234567")) // trueprintln(phonePattern.matches("+7926123456")) // false (9 dígitos em vez de 10)Busca da primeira correspondência (find)
O método find() retorna a primeira correspondência como um objeto MatchResult?:
val text = "Contatos: email@test.com e support@domain.org"val emailRegex = "[\\\\w.]+@[\\\\w.]+\\\\.[a-z]+".toRegex()val match = emailRegex.find(text)println(match?.value) // email@test.comprintln(match?.range) // 10..23 (índices de início e fim)Busca de todas as correspondências (findAll)
Para obter todas as correspondências, use findAll(), que retorna uma sequência Sequence<MatchResult>:
val allMatches = emailRegex.findAll(text)allMatches.forEach { match -> println("Encontrado: ${match.value} na posição ${match.range.first}")}// Saída:// Encontrado: email@test.com na posição 10// Encontrado: support@domain.org na posição 28Verificação de existência (containsMatchIn)
O método containsMatchIn() retorna um Boolean — se há pelo menos uma correspondência:
val hasEmail = emailRegex.containsMatchIn(text)println(hasEmail) // true3. Substituição e split com Regex
Expressões regulares são excelentes para substituir partes de uma string e dividir texto.
Substituição da primeira correspondência (replaceFirst)
val original = "ID: 12345, código: 67890"val digitRegex = "\\\\d+".toRegex()val masked = digitRegex.replaceFirst(original, "***")println(masked) // ID: ***, código: 67890Substituição de todas as correspondências (replace)
val censored = digitRegex.replace(original, "***")println(censored) // ID: ***, código: ***Substituição usando lambda
Você pode passar uma lambda que será chamada para cada correspondên