Expresiones regulares en Kotlin: guía completa con ejemplos
Las expresiones regulares (regex) son una herramienta poderosa para buscar, extraer y reemplazar texto según un patrón. En Kotlin, el trabajo con expresiones regulares se implementa a través de la clase Regex, que proporciona una API conveniente y compatibilidad total con la implementación de Java java.util.regex.Pattern. En este artículo, analizaremos todos los aspectos del uso de expresiones regulares en Kotlin con ejemplos ilustrativos.
1. Creación y uso básico de Regex en Kotlin
En Kotlin hay dos formas principales de crear una expresión regular:
- Constructor de la clase
Regex— pasas una cadena con el patrón. - Método de extensión
.toRegex()— se llama sobre una cadena.
Ejemplos de creación:
// Forma 1: constructorval regex1 = Regex("\\\\d{3}-\\\\d{2}-\\\\d{4}")
// Forma 2: toRegex()val regex2 = "\\\\d{3}-\\\\d{2}-\\\\d{4}".toRegex()
// Con banderas (búsqueda sin distinción de mayúsculas/minúsculas)val regex3 = Regex("hello", RegexOption.IGNORE_CASE)
// Modo multilíneaval regex4 = Regex("^start", RegexOption.MULTILINE)Ten en cuenta: en Kotlin, al igual que en Java, para escapar la barra invertida se usa doble barra \\\\. Si escribes \\d — debes escribir "\\\\d".
2. Funciones principales de Regex: verificación, búsqueda, reemplazo
La clase Regex proporciona varias funciones clave para trabajar con cadenas.
2.1. Verificación de coincidencia completa — matches()
La función matches() devuelve true si toda la cadena coincide completamente con el patrón.
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. Búsqueda de la primera coincidencia — find()
Devuelve la primera coincidencia encontrada como un objeto MatchResult? (o null si no se encuentra nada).
val text = "Mi teléfono: 123-45-6789 y también 987-65-4321"val phoneRegex = Regex("\\\\d{3}-\\\\d{2}-\\\\d{4}")
val firstMatch = phoneRegex.find(text)if (firstMatch != null) { println("Teléfono encontrado: ${firstMatch.value}") // Teléfono encontrado: 123-45-6789 println("Inicio: ${firstMatch.range.first}") // Inicio: 13}2.3. Búsqueda de todas las coincidencias — findAll()
Devuelve una secuencia Sequence<MatchResult> de todas las coincidencias no superpuestas.
val text = "Precios: 100 rub., 250 rub., 50 rub."val priceRegex = Regex("\\\\d+")
val prices = priceRegex.findAll(text)prices.forEach { match -> println("Precio: ${match.value}")}// Salida:// Precio: 100// Precio: 250// Precio: 502.4. Reemplazo según patrón — replace()
La función replace() reemplaza todas las coincidencias encontradas con la cadena especificada o el resultado de una expresión lambda.
val text = "Mi email: john@mail.com y support@site.org"val emailRegex = Regex("[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\\\.[a-zA-Z]{2,}")
// Reemplazo simpleval masked = emailRegex.replace(text, "[EMAIL OCULTO]")println(masked) // Mi email: [EMAIL OCULTO] y [EMAIL OCULTO]
// Reemplazo con lambda (dinámico)val replaced = emailRegex.replace(text) { match -> val local = match.value.split("@")[0] "${local.first()}***@***"}println(replaced) // Mi email: j***@*** y s***@***2.5. División de cadena — split()
Divide la cadena según las coincidencias con la expresión regular.
val text = "manzana,pera;plátano|naranja"val separators = Regex("[,;|]")
val fruits = separators.split(text)println(fru