Expressions régulières en Swift : des bases aux exemples avancés
Les expressions régulières (regex) sont un outil puissant pour travailler avec du texte, permettant de rechercher, remplacer et valider des chaînes selon des motifs complexes. En Swift pour iOS et macOS, le travail avec les regex est implémenté via la classe NSRegularExpression du framework Foundation. Dans cet article, nous aborderons tous les aspects clés : de la création de motifs simples au traitement des résultats et à l'optimisation des performances.
Cet article sera utile aussi bien aux débutants découvrant Swift qu'aux développeurs expérimentés souhaitant approfondir leurs connaissances sur le traitement du texte dans les applications iOS/macOS.
1. Bases du travail avec NSRegularExpression
La classe NSRegularExpression est l'outil principal pour travailler avec les expressions régulières en Swift. Elle fournit des méthodes pour rechercher, remplacer et extraire des données à partir de chaînes.
1.1. Création d'une expression régulière
Pour créer un objet NSRegularExpression, on utilise un initialiseur qui prend une chaîne contenant le motif et des options facultatives (NSRegularExpression.Options). La construction est encapsulée dans try, car elle peut générer une erreur en cas de syntaxe incorrecte du motif.
import Foundation
let pattern = "\\\\d{3}-\\\\d{2}-\\\\d{4}" // Exemple : 123-45-6789do { let regex = try NSRegularExpression(pattern: pattern, options: []) print("Expression régulière créée avec succès")} catch { print("Erreur dans la syntaxe de l'expression régulière : \\(error.localizedDescription)")}1.2. Options principales (NSRegularExpression.Options)
Les options permettent de modifier le comportement de l'expression régulière. Voici les plus couramment utilisées :
.caseInsensitive— ignorer la casse des caractères (A = a)..allowCommentsAndWhitespace— ignorer les espaces et les commentaires dans le motif..dotMatchesLineSeparators— le point (.) correspond également aux caractères de saut de ligne..anchorsMatchLines— les caractères ^ et $ correspondent au début et à la fin de chaque ligne, et non de toute la chaîne.
Exemple avec l'option .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("Correspondance trouvée") // Affiche : Correspondance trouvée}2. Recherche de correspondances et travail avec les résultats
Après avoir créé une expression régulière, on peut effectuer une recherche de correspondances dans une chaîne. Pour cela, on utilise les méthodes firstMatch et matches.
2.1. Recherche de la première correspondance
La méthode firstMatch(in:options:range:) retourne la première correspondance trouvée sous la forme d'un objet NSTextCheckingResult (ou nil si rien n'est trouvé).
let text = "Mon numéro : 123-45-6789, ainsi que 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("Première correspondance : \\(matchedString)") // 123-45-6789}2.2. Recherche de toutes les correspondances
La méthode matches(in:options:range:) retourne un tableau de toutes les correspondances. C'est utile lorsqu'on doit traiter chaque occurrence du motif.
let text = "Codes : 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