Expresiones regulares en Swift: una potente herramienta para trabajar con texto
Las expresiones regulares (regex) son una herramienta indispensable para los desarrolladores de iOS y macOS. Permiten realizar búsquedas complejas, reemplazos y validación de datos textuales mediante patrones compactos. En Swift, el trabajo con expresiones regulares se implementa a través de la clase NSRegularExpression del framework Foundation. En este artículo analizaremos todos los aspectos del uso de regex en Swift: desde la sintaxis básica hasta técnicas avanzadas, con ejemplos prácticos para aplicaciones iOS y macOS.
Fundamentos de NSRegularExpression en Swift
Para trabajar con expresiones regulares en Swift se utiliza la clase NSRegularExpression. Proporciona potentes métodos para buscar, reemplazar y extraer datos de cadenas. Veamos la sintaxis básica de inicialización:
import Foundation
let pattern = "\\\\d{3}-\\\\d{2}-\\\\d{4}" // Patrón para SSNlet text = "Mi SSN: 123-45-6789"
do { let regex = try NSRegularExpression(pattern: pattern) let results = regex.matches(in: text, range: NSRange(text.startIndex..., in: text)) for match in results { let range = Range(match.range, in: text)! print("Encontrado: \\(text[range])") }} catch { print("Error en la expresión regular: \\(error.localizedDescription)")}Tenga en cuenta el escape de la barra invertida en las cadenas de Swift. Por cada barra invertida en el patrón, debe colocar dos (\\\\d en lugar de \\d).
Creación y configuración de la expresión regular
El constructor NSRegularExpression acepta un parámetro opcional options que permite configurar el comportamiento del regex:
.caseInsensitive— ignorar mayúsculas y minúsculas.dotMatchesLineSeparators— el punto coincide con caracteres de salto de línea.anchorsMatchLines— los anclajes ^ y $ funcionan para cada línea.useUnixLineSeparators— usar solo como separador de líneas
let regex = try NSRegularExpression( pattern: "swift", options: [.caseInsensitive])// Ahora el patrón encontrará "Swift", "SWIFT", "swift", etc.Búsqueda y extracción de datos con regex
Una de las principales tareas de las expresiones regulares es buscar subcadenas que coincidan con el patrón. En Swift esto se hace mediante el método matches(in:options:range:).
Búsqueda de todas las coincidencias
let text = "Contactos: email@example.com, support@test.org, admin@site.com"let emailPattern = "[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\\\.[A-Za-z]{2,}"
let regex = try NSRegularExpression(pattern: emailPattern)let matches = regex.matches(in: text, range: NSRange(text.startIndex..., in: text))
print("Emails encontrados: \\(matches.count)")for match in matches { if let range = Range(match.range, in: text) { print(String(text[range])) }}// Salida:// Emails encontrados: 3// email@example.com// support@test.org// admin@site.comBúsqueda con captura de grupos
Los grupos entre paréntesis permiten extraer partes de la coincidencia. Esto es especialmente útil para analizar datos estructurados:
let logLine = "2024-01-15 14:30:22 [ERROR] No se pudo conectar al servidor"let logPattern = "(\\\\d{4}-\\\\d{2}-\\\\d{2}) (\\\\d{2}:\\\\d{2}:\\\\d{2}) \\\\[(\\\\w+)\\\\] (.+)"
let regex = try NSRegularExpression(pattern: logPattern)if let match = regex.firstMatch(in: logLine, range: NSRange(logLine.startIndex..., in: logLine)) { let dateRange = Range(match.range(at: 1), in: logLine)! let timeRange = Range(match.range(at: 2), in: logLine)! let levelRange = Range(match.range(at: 3), in: logLine)! let messageRange = Range(match.range(at: 4), in: logLine)! print("Fecha: \\(logLine[dateRange])") print("Hora: \\(logL