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

Expresiones regulares en Swift: desde lo básico hasta ejemplos avanzados



Las expresiones regulares (regex) son una herramienta poderosa para trabajar con texto, permitiendo buscar, reemplazar y validar cadenas según patrones complejos. En Swift para iOS y macOS, 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 clave: desde la creación de patrones simples hasta el procesamiento de resultados y la optimización del rendimiento.



El artículo será útil tanto para principiantes que recién se familiarizan con Swift, como para desarrolladores experimentados que deseen profundizar sus conocimientos sobre el trabajo con texto en aplicaciones iOS/macOS.



1. Fundamentos del trabajo con NSRegularExpression



La clase NSRegularExpression es la herramienta principal para trabajar con expresiones regulares en Swift. Proporciona métodos para buscar, reemplazar y extraer datos de cadenas.



1.1. Creación de una expresión regular



Para crear un objeto NSRegularExpression se utiliza un inicializador que recibe una cadena con el patrón y flags opcionales (NSRegularExpression.Options). La construcción está envuelta en try, ya que puede lanzar un error si la sintaxis del patrón es incorrecta.



import Foundation

let pattern = "\\\\d{3}-\\\\d{2}-\\\\d{4}" // Ejemplo: 123-45-6789do { let regex = try NSRegularExpression(pattern: pattern, options: []) print("Expresión regular creada exitosamente")} catch { print("Error en la sintaxis de la expresión regular: \\(error.localizedDescription)")}


1.2. Opciones principales (NSRegularExpression.Options)



Las opciones permiten modificar el comportamiento de la expresión regular. Estas son las más utilizadas:



  • .caseInsensitive — ignorar mayúsculas/minúsculas (A = a).
  • .allowCommentsAndWhitespace — ignorar espacios y comentarios en el patrón.
  • .dotMatchesLineSeparators — el punto (.) también coincide con caracteres de salto de línea.
  • .anchorsMatchLines — los caracteres ^ y $ coinciden con el inicio y final de cada línea, no de toda la cadena.


Ejemplo con la opción .caseInsensitive:



let pattern = "hello"let regex = try NSRegularExpression(pattern: pattern, options: .caseInsensitive)let testString = "Hello, World!"let range = NSRange(location: 0, length: testString.utf16.count)if regex.firstMatch(in: testString, options: [], range: range) != nil {    print("Coincidencia encontrada") // Imprime: Coincidencia encontrada}


2. Búsqueda de coincidencias y trabajo con resultados



Después de crear la expresión regular, se pueden buscar coincidencias en una cadena. Para esto se utilizan los métodos firstMatch y matches.



2.1. Búsqueda de la primera coincidencia



El método firstMatch(in:options:range:) devuelve la primera coincidencia encontrada como un objeto NSTextCheckingResult (o nil si no se encuentra nada).



let text = "Mi número: 123-45-6789, y también 987-65-4321"let pattern = "\\\\d{3}-\\\\d{2}-\\\\d{4}"let regex = try NSRegularExpression(pattern: pattern, options: [])let range = NSRange(location: 0, length: text.utf16.count)

if let match = regex.firstMatch(in: text, options: [], range: range) { let matchedString = (text as NSString).substring(with: match.range) print("Primera coincidencia: \\(matchedString)") // 123-45-6789}


2.2. Búsqueda de todas las coincidencias



El método matches(in:options:range:) devuelve un array de todas las coincidencias. Esto es útil cuando se necesita procesar cada aparición del patrón.



let text = "Códigos: ABC-123, DEF-456, GHI-789"let pattern = "[A-Z]{3}-\\\\d{3}"let regex = try NSRegularExpression(pattern: pattern, options: [])let range = NSRange(location: 0, length: text.utf16.count)let matches = regex.matches(in: tex                

Blogs

Book Recommendations