Expressions régulières en Swift : guide complet avec exemples

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

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                

Blogs

Book Recommendations