Expresiones regulares en Swift: guía completa para principiantes
Las expresiones regulares (regex) son una herramienta poderosa para buscar, reemplazar y validar datos de texto. En Swift, el trabajo con expresiones regulares se implementa a través de la clase NSRegularExpression del framework Foundation. En este artículo aprenderá a crear y aplicar expresiones regulares en aplicaciones para iOS y macOS, analizará ejemplos reales y dominará los conceptos básicos de la sintaxis.
1. Conceptos básicos de la sintaxis de expresiones regulares
Antes de escribir código en Swift, es importante comprender los símbolos y construcciones básicas de regex. Aquí están los elementos clave:
.— cualquier carácter (excepto salto de línea)*— 0 o más repeticiones del carácter anterior+— 1 o más repeticiones?— 0 o 1 repetición (hace opcional el carácter anterior)\\d— cualquier dígito (0-9)\\w— cualquier letra, dígito o guion bajo[abc]— uno de los caracteres a, b o c[^abc]— cualquier carácter excepto a, b, c^— inicio de la cadena$— final de la cadena
Estos símbolos se combinan para crear patrones. Por ejemplo, el patrón ^[A-Za-z]+$ significa: la cadena consiste solo en letras del alfabeto latino de principio a fin.
2. Creación y uso de NSRegularExpression en Swift
En Swift, el trabajo con regex comienza importando Foundation y creando una instancia de NSRegularExpression. Veamos un ejemplo simple: buscar todos los dígitos en una cadena.
import Foundation
let text = "Mi número: 123-456-7890"let pattern = "\\\\d+" // patrón: uno o más dígitos
do { let regex = try NSRegularExpression(pattern: pattern) let results = regex.matches(in: text, range: NSRange(text.startIndex..., in: text)) for match in results { if let range = Range(match.range, in: text) { print("Encontrado: \\(text[range])") } }} catch { print("Error en la expresión regular: \\(error.localizedDescription)")}// Salida:// Encontrado: 123// Encontrado: 456// Encontrado: 7890Tenga en cuenta el escape de la barra invertida: en la cadena Swift "\\\\d" corresponde a la expresión regular \\d. La clase NSRegularExpression lanza una excepción si el patrón es inválido, por lo que usamos try-catch.
2.1. Trabajo con NSRange
El método matches(in:range:) devuelve un array de objetos NSTextCheckingResult. Cada resultado contiene un rango (NSRange) de la coincidencia encontrada. Para convertir a Swift Range use el inicializador Range(match.range, in: text).
3. Ejemplos prácticos de expresiones regulares
Veamos tres tareas típicas: validación de email, extracción de URL y reemplazo de texto.
3.1. Validación de dirección de email
Verifiquemos si una cadena coincide con un patrón simple de email (versión simplificada):
func isValidEmail(_ email: String) -> Bool { let pattern = "^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\\\.[A-Za-z]{2,}$" let regex = try? NSRegularExpression(pattern: pattern) let range = NSRange(location: 0, length: email.utf16.count) return regex?.firstMatch(in: email, range: range) != nil}
print(isValidEmail("test@example.com")) // trueprint(isValidEmail("invalid-email")) // falseAquí usamos firstMatch, que devuelve la primera coincidencia. Si no hay coincidencias, devuelve nil.
3.2. Extracción de URL de un texto
Supongamos que tenemos una cadena con varios enlaces. Extraigamos todas las URL:
let text = "Visite el sitio https://pythonlib.ru o escriba a support@pythonlib.ru"let pattern = "https?://[\\\\w./%-]+"
do