Expresiones regulares en Swift: guía completa con ejemplos

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

Introducción a las expresiones regulares en Swift

\n\n

Las expresiones regulares (regex) son una herramienta poderosa para buscar, extraer y reemplazar texto según un patrón. En Swift, el trabajo con expresiones regulares se implementa a través de la clase NSRegularExpression del framework Foundation, así como mediante métodos integrados de cadenas. Es una herramienta indispensable en el desarrollo de aplicaciones iOS y macOS para la validación de formularios, análisis de datos, filtrado de texto y muchas otras tareas.

\n\n

En este artículo, analizaremos las principales capacidades de trabajar con expresiones regulares en Swift con ejemplos prácticos. Aprenderás a crear patrones, realizar búsquedas, reemplazos y extracción de datos.

\n\n

Fundamentos de NSRegularExpression

\n\n

La clase NSRegularExpression es la forma principal de trabajar con expresiones regulares en Swift. Veamos las operaciones básicas.

\n\n

Creación de una expresión regular

\n\n
import Foundation\n\nlet pattern = "[A-Za-z]+@[A-Za-z]+\\\\.[A-Za-z]+"\nguard let regex = try? NSRegularExpression(pattern: pattern) else {\n    fatalError("Patrón inválido")\n}
\n\n

Observa la doble barra invertida \\\\ — en Swift, las cadenas requieren escapar la barra invertida.

\n\n

Búsqueda de la primera coincidencia

\n\n
let text = "Contáctenos por email: support@example.com"\nlet nsString = text as NSString\nlet range = NSRange(location: 0, length: nsString.length)\n\nif let match = regex.firstMatch(in: text, range: range) {\n    let email = nsString.substring(with: match.range)\n    print("Email encontrado: \\(email)") // support@example.com\n}
\n\n

Búsqueda de todas las coincidencias

\n\n
let text = "Contactos: info@site.com, admin@site.com, support@site.com"\nlet matches = regex.matches(in: text, range: NSRange(location: 0, length: text.count))\n\nfor match in matches {\n    let range = match.range\n    let email = (text as NSString).substring(with: range)\n    print(email)\n}\n// Salida:\n// info@site.com\n// admin@site.com\n// support@site.com
\n\n

Uso de grupos de captura

\n\n

Los grupos de captura permiten extraer partes de una coincidencia. En Swift, los grupos se indican con paréntesis ().

\n\n

Extracción de datos con grupos

\n\n
let pattern = "(\\\\d{4})-(\\\\d{2})-(\\\\d{2})"\nlet dateString = "Hoy: 2024-03-15"\n\nguard let regex = try? NSRegularExpression(pattern: pattern) else { return }\nlet nsString = dateString as NSString\n\nif let match = regex.firstMatch(in: dateString, range: NSRange(location: 0, length: nsString.length)) {\n    let fullDate = nsString.substring(with: match.range) // 2024-03-15\n    let year = nsString.substring(with: match.range(at: 1)) // 2024\n    let month = nsString.substring(with: match.range(at: 2)) // 03\n    let day = nsString.substring(with: match.range(at: 3)) // 15\n    \n    print("Año: \\(year), Mes: \\(month), Día: \\(day)")\n}
\n\n

Grupos nombrados (trabajo con Range)

\n\n

A partir de Swift 5.7, se puede usar una sintaxis más conveniente con Range:

\n\n
let text = "Precio: 1500 rublos"\nlet pattern = #"(\\d+)\\srublos"#\n\nif let range = text.range(of: pattern, options: .regularExpression) {\n    let match = text[range]\n    print("Encontrado: \\(match)") // 1500 rublos\n}
\n\n

Reemplazo de texto con expresiones regulares

\n\n

Una de las capacidades más útiles es el reemplazo de partes de texto según un patrón.

\n\n

Reemplazo simple

\n\n
let text = "Llame al número +7 (123) 456-78-90"\nlet pattern = "\\\\+7\\\\s\\\\(\\\\d{3}\\\\)\\\\s\\\\d{3}-\\\\d{2}-\\\\d{2}"\nlet replacement = "[número oculto]"\n\nguard let regex = try? NSRegularExpression(pattern: pattern) else { return }\nlet modifiedText = regex.stringByReplacingMatches(\n    in: text,\n    range: NSRange(location: 0, length: text.count),\n    withTemplate: replacement\n)\n\nprint(modifiedText) // Llame al número [número oculto]
\n\n

Reemplazo

Blogs

Book Recommendations