Expressions régulières en Swift : guide complet pour débutants
\nLes expressions régulières (regex) sont un outil puissant pour la recherche, le remplacement et la validation de données textuelles. En Swift, le travail avec les expressions régulières est implémenté via la classe NSRegularExpression du framework Foundation. Dans cet article, vous apprendrez à créer et à appliquer des expressions régulières dans des applications pour iOS et macOS, analyserez des exemples concrets et maîtriserez les bases de la syntaxe.
1. Bases de la syntaxe des expressions régulières
\nAvant d'écrire du code en Swift, il est important de comprendre les symboles et constructions regex de base. Voici les éléments clés :
\n- \n
.— n'importe quel caractère (sauf saut de ligne) \n *— 0 ou plusieurs répétitions du caractère précédent \n +— 1 ou plusieurs répétitions \n ?— 0 ou 1 répétition (rend le caractère précédent facultatif) \n \\d— n'importe quel chiffre (0-9) \n \\w— n'importe quelle lettre, chiffre ou tiret bas \n [abc]— un des caractères a, b ou c \n [^abc]— n'importe quel caractère sauf a, b, c \n ^— début de chaîne \n $— fin de chaîne \n
Ces symboles sont combinés pour créer des motifs. Par exemple, le motif ^[A-Za-z]+$ signifie : la chaîne est composée uniquement de lettres de l'alphabet latin du début à la fin.
2. Création et utilisation de NSRegularExpression en Swift
\nEn Swift, le travail avec regex commence par l'importation de Foundation et la création d'une instance de NSRegularExpression. Examinons un exemple simple : la recherche de tous les chiffres dans une chaîne.
import Foundation\n\nlet text = "Mon numéro : 123-456-7890"\nlet pattern = "\\\\d+" // motif : un ou plusieurs chiffres\n\ndo {\n let regex = try NSRegularExpression(pattern: pattern)\n let results = regex.matches(in: text, range: NSRange(text.startIndex..., in: text))\n \n for match in results {\n if let range = Range(match.range, in: text) {\n print("Trouvé : \\(text[range])")\n }\n }\n} catch {\n print("Erreur dans l'expression régulière : \\(error.localizedDescription)")\n}\n// Sortie :\n// Trouvé : 123\n// Trouvé : 456\n// Trouvé : 7890\nNotez l'échappement de la barre oblique inversée : dans la chaîne Swift "\\\\d" correspond à l'expression régulière \\d. La classe NSRegularExpression lève une exception en cas de motif incorrect, nous utilisons donc try-catch.
2.1. Travail avec NSRange
\nLa méthode matches(in:range:) retourne un tableau d'objets NSTextCheckingResult. Chaque résultat contient une plage (NSRange) de la correspondance trouvée. Pour convertir en Swift Range, utilisez l'initialiseur Range(match.range, in: text).
3. Exemples pratiques d'expressions régulières
\nExaminons trois tâches typiques : validation d'email, extraction d'URL et remplacement de texte.
\n\n3.1. Validation d'adresse email
\nVérifions si la chaîne correspond à un motif simple d'email (version simplifiée) :
\nfunc isValidEmail(_ email: String) -> Bool {\n let pattern = "^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\\\.[A-Za-z]{2,}$"\n let regex = try? NSRegularExpression(pattern: pattern)\n let range = NSRange(location: 0, length: email.utf16.count)\n return regex?.firstMatch(in: email, range: range) != nil\n}\n\nprint(isValidEmail("test@example.com")) // true\nprint(isValidEmail("invalid-email")) // false\nIci, nous utilisons firstMatch, qui retourne la première correspondance. S'il n'y a pas de correspondance, il retourne nil.
3.2. Extraction d'URL à partir d'un texte
\nSupposons que nous ayons une chaîne avec plusieurs liens. Extrayons toutes les URL :
\nlet text = "Visitez le site https://pythonlib.ru ou écrivez à support@pythonlib.ru"\nlet pattern = "https?://[\\\\w./%-]+"\n\ndo