Introducción a las expresiones regulares en Swift
\n\nLas 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.
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\nFundamentos de NSRegularExpression
\n\nLa clase NSRegularExpression es la forma principal de trabajar con expresiones regulares en Swift. Veamos las operaciones básicas.
Creación de una expresión regular
\n\nimport 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\nObserva la doble barra invertida \\\\ — en Swift, las cadenas requieren escapar la barra invertida.
Búsqueda de la primera coincidencia
\n\nlet 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\nBúsqueda de todas las coincidencias
\n\nlet 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\nUso de grupos de captura
\n\nLos grupos de captura permiten extraer partes de una coincidencia. En Swift, los grupos se indican con paréntesis ().
Extracción de datos con grupos
\n\nlet 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\nGrupos nombrados (trabajo con Range)
\n\nA partir de Swift 5.7, se puede usar una sintaxis más conveniente con Range:
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\nReemplazo de texto con expresiones regulares
\n\nUna de las capacidades más útiles es el reemplazo de partes de texto según un patrón.
\n\nReemplazo simple
\n\nlet 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