Expresiones regulares en Kotlin con ejemplos: en la práctica

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Expresiones regulares en Kotlin con ejemplos: en la práctica

\n\n

Las expresiones regulares (regex) son una herramienta poderosa para trabajar con cadenas. En Kotlin, están implementadas basándose en las clases de Java Pattern y Matcher, pero el lenguaje añade sus propias extensiones convenientes y azúcar sintáctico. En este artículo, analizaremos cómo usar expresiones regulares en Kotlin con ejemplos reales: desde la búsqueda simple hasta el reemplazo y la división de cadenas.

\n\n

Fundamentos de sintaxis: creación y compilación

\n\n

En Kotlin, una expresión regular se puede crear de dos maneras: a través de la clase Regex o usando una cadena con un patrón. La primera forma es preferible, ya que proporciona más métodos.

\n\n
// Forma 1: a través de la clase Regex\nval regex = Regex("\\\\d+") // uno o más dígitos\n\n// Forma 2: a través de una cadena (no recomendado para expresiones complejas)\nval pattern = "\\\\d+".toRegex()
\n\n

Observa la doble barra invertida de escape: \\\\d — esto es un escape para Java/Kotlin, para obtener el carácter \\d en la cadena. Para simplificar, Kotlin admite cadenas raw (triples comillas """), donde no se requiere escape:

\n\n
val regex = Regex("""\\d+""") // cadena raw — no es necesario duplicar las barras invertidas
\n\n

También se pueden añadir banderas, por ejemplo, RegexOption.IGNORE_CASE:

\n\n
val regex = Regex("kotlin", RegexOption.IGNORE_CASE)
\n\n

Búsqueda y verificación de coincidencias

\n\n

Las operaciones más comunes son verificar si una cadena contiene una subcadena según un patrón y encontrar todas las coincidencias.

\n\n

Verificación de existencia de coincidencia: containsMatchIn

\n\n
val text = "Mi número: 123-45-678"\nval digitRegex = Regex("""\\d+""")\n\nif (digitRegex.containsMatchIn(text)) {\n    println("¡El texto contiene dígitos!")\n}
\n\n

Búsqueda de la primera coincidencia: find

\n\n
val result = digitRegex.find(text)\nprintln(result?.value) // Imprime: 123
\n\n

Búsqueda de todas las coincidencias: findAll

\n\n
val allMatches = digitRegex.findAll(text)\nallMatches.forEach { match ->\n    println("Encontrado: ${match.value}") // 123, 45, 678\n}
\n\n

El método findAll devuelve una secuencia de objetos MatchResult. Cada uno de estos objetos contiene no solo la coincidencia en sí (.value), sino también su posición en la cadena (.range).

\n\n

Trabajo con grupos de captura

\n\n

Los grupos de captura son partes del patrón encerradas entre paréntesis. Permiten extraer fragmentos de datos específicos. Por ejemplo, analicemos un email en nombre de usuario y dominio:

\n\n
val email = "user@example.com"\nval emailRegex = Regex("""(.+)@(.+)""")\nval matchResult = emailRegex.find(email)\n\nif (matchResult != null) {\n    val (username, domain) = matchResult.destructured\n    println("Nombre de usuario: $username") // user\n    println("Dominio: $domain")             // example.com\n}
\n\n

La construcción destructured descompone convenientemente los grupos en variables. Si hay más grupos, se puede acceder por índice:

\n\n
val fullMatch = matchResult.value      // user@example.com\nval group1 = matchResult.groupValues[1] // user\nval group2 = matchResult.groupValues[2] // example.com
\n\n

Grupos con nombre (Kotlin 1.7+)

\n\n

A partir de Kotlin 1.7, se pueden usar grupos con nombre:

\n\n
val namedRegex = Regex("""(?<name>\\w+)@(?<domain>\\w+\\.\\w+)""")\nval match = namedRegex.find("contact@kotlin.org")\nif (match != null) {\n    println(match.groups["name"]?.value)   // contact\n    println(match.groups["domain"]?.value) // kotlin.org\n}
\n\n

Reemplazo de texto con replace

\n\n

El método replace permite reemplazar todas las coincidencias con una nueva cadena. En el patrón de reemplazo, se puede hacer referencia a los grupos de captura con

Blogs

Book Recommendations