Expressões Regulares em Kotlin com Exemplos: na Prática
Expressões regulares (regex) são uma ferramenta poderosa para trabalhar com texto, permitindo realizar busca, substituição e validação de strings por padrão. Em Kotlin, o trabalho com expressões regulares é implementado através da classe Regex e um conjunto de funções de extensão convenientes. Neste artigo, vamos analisar a sintaxe, os métodos principais e ver exemplos práticos que ajudarão você a dominar rapidamente o regex em Kotlin.
1. Fundamentos do Trabalho com a Classe Regex
Em Kotlin, uma expressão regular é criada usando a classe Regex. O padrão pode ser definido por uma string ou usando uma raw string (aspas triplas """), o que é especialmente conveniente para evitar escapar barras invertidas.
// String comumval pattern1 = Regex("\\\\d+") // um ou mais dígitos
// Raw string (recomendado)val pattern2 = Regex("""\\d+""") // a mesma coisa, mas sem escapeA classe Regex também aceita flags opcionais, como RegexOption.IGNORE_CASE para busca sem distinção de maiúsculas/minúsculas.
val caseInsensitive = Regex("""hello""", RegexOption.IGNORE_CASE)2. Métodos Principais: match, find, replace
Kotlin fornece vários métodos-chave para trabalhar com expressões regulares. Vamos analisar os mais populares.
2.1. Método matchEntire (correspondência completa)
Verifica se toda a string corresponde ao padrão. Retorna MatchResult? ou null.
val regex = Regex("""\\d{3}-\\d{2}-\\d{4}""")val text = "123-45-6789"val matchResult = regex.matchEntire(text)println(matchResult?.value) // Saída: 123-45-6789
// Se a string não corresponder ao padrãoval badText = "123-45-678"println(regex.matchEntire(badText)) // Saída: null2.2. Método find (primeira correspondência)
Busca a primeira ocorrência do padrão na string. Retorna MatchResult?.
val regex = Regex("""\\d+""")val text = "Preço: 150 reais, desconto: 30%"val firstMatch = regex.find(text)println(firstMatch?.value) // Saída: 1502.3. Método findAll (todas as correspondências)
Encontra todas as ocorrências não sobrepostas do padrão. Retorna uma sequência de MatchResult.
val regex = Regex("""\\d+""")val text = "Preço: 150 reais, desconto: 30%"val allMatches = regex.findAll(text)allMatches.forEach { println(it.value) }// Saída:// 150// 302.4. Método replace (substituição)
Substitui todas as ocorrências do padrão pela string especificada ou pelo resultado de uma lambda.
val regex = Regex("""\\d+""")val text = "ID: 12345, código: 67890"val result = regex.replace(text, "***")println(result) // Saída: ID: ***, código: ***
// Substituição usando lambda (substituição dinâmica)val dynamicResult = regex.replace(text) { matchResult -> "[" + matchResult.value.toInt().toString() + "]"}println(dynamicResult) // Saída: ID: [12345], código: [67890]3. Grupos de Captura (capturing groups)
Grupos de captura permitem extrair partes da correspondência. Em Kotlin, os grupos podem ser acessados por índice ou nome (se definido).
3.1. Acesso por índice
val regex = Regex("""(\\d{2})\\.(\\d{2})\\.(\\d{4})""") // data no formato DD.MM.AAAAval text = "Hoje: 15.03.2024"val match = regex.find(text)if (match != null) { val (day, month, year) = match.destructured println("Dia: $day, Mês: $month, Ano: $year") // Saída: Dia: 15, Mês: 03, Ano: 2024}3.2. Grupos nomeados
Em Kotlin, é possível usar grupos nomeados (sintaxe (?<name>...)).
val regex = Regex("""(?<username>\\w+)@(?<domain>\\w+\\.\\w+)""")val text = "email: user@example.com"val match = regex.find(text)if (match != null) { val username = match.groups["u