Introduction aux expressions régulières en Swift
\n\nLes expressions régulières (regex) sont un outil puissant pour rechercher, extraire et remplacer du texte selon un motif. En Swift, le travail avec les expressions régulières est implémenté via la classe NSRegularExpression du framework Foundation, ainsi que via les méthodes intégrées des chaînes. C'est un outil indispensable lors du développement d'applications iOS et macOS pour la validation de formulaires, l'analyse de données, le filtrage de texte et de nombreuses autres tâches.
Dans cet article, nous allons explorer les principales possibilités de travail avec les expressions régulières en Swift à travers des exemples pratiques. Vous apprendrez à créer des motifs, effectuer des recherches, des remplacements et des extractions de données.
\n\nFondamentaux de NSRegularExpression
\n\nLa classe NSRegularExpression est la méthode principale pour travailler avec les expressions régulières en Swift. Examinons les opérations de base.
Création d'une expression régulière
\n\nimport Foundation\n\nlet pattern = "[A-Za-z]+@[A-Za-z]+\\\\.[A-Za-z]+"\nguard let regex = try? NSRegularExpression(pattern: pattern) else {\n fatalError("Motif invalide")\n}\n\nNotez la double barre oblique \\\\ — en Swift, les chaînes nécessitent l'échappement de la barre oblique inverse.
Recherche de la première correspondance
\n\nlet text = "Contactez-nous par email : support@example.com"\nlet nsString = text as NSString\nlet range = NSRange(location: 0, length: nsString.length)\n\nif let match = regex.firstMatch(in: text, range: range) {\n let email = nsString.substring(with: match.range)\n print("Email trouvé : \\(email)") // support@example.com\n}\n\nRecherche de toutes les correspondances
\n\nlet text = "Contacts : info@site.com, admin@site.com, support@site.com"\nlet matches = regex.matches(in: text, range: NSRange(location: 0, length: text.count))\n\nfor match in matches {\n let range = match.range\n let email = (text as NSString).substring(with: range)\n print(email)\n}\n// Sortie :\n// info@site.com\n// admin@site.com\n// support@site.com\n\nUtilisation des groupes de capture
\n\nLes groupes de capture permettent d'extraire des parties de la correspondance. En Swift, les groupes sont indiqués par des parenthèses ().
Extraction de données avec des groupes
\n\nlet pattern = "(\\\\d{4})-(\\\\d{2})-(\\\\d{2})"\nlet dateString = "Aujourd'hui : 2024-03-15"\n\nguard let regex = try? NSRegularExpression(pattern: pattern) else { return }\nlet nsString = dateString as NSString\n\nif let match = regex.firstMatch(in: dateString, range: NSRange(location: 0, length: nsString.length)) {\n let fullDate = nsString.substring(with: match.range) // 2024-03-15\n let year = nsString.substring(with: match.range(at: 1)) // 2024\n let month = nsString.substring(with: match.range(at: 2)) // 03\n let day = nsString.substring(with: match.range(at: 3)) // 15\n \n print("Année : \\(year), Mois : \\(month), Jour : \\(day)")\n}\n\nGroupes nommés (travail avec Range)
\n\nDepuis Swift 5.7, vous pouvez utiliser une syntaxe plus pratique avec Range :
let text = "Prix : 1500 roubles"\nlet pattern = #"(\\d+)\\sroubles"#\n\nif let range = text.range(of: pattern, options: .regularExpression) {\n let match = text[range]\n print("Trouvé : \\(match)") // 1500 roubles\n}\n\nRemplacement de texte avec des expressions régulières
\n\nL'une des fonctionnalités les plus utiles est le remplacement de parties de texte selon un motif.
\n\nRemplacement simple
\n\nlet text = "Appelez au numéro +7 (123) 456-78-90"\nlet pattern = "\\\\+7\\\\s\\\\(\\\\d{3}\\\\)\\\\s\\\\d{3}-\\\\d{2}-\\\\d{2}"\nlet replacement = "[numéro masqué]"\n\nguard let regex = try? NSRegularExpression(pattern: pattern) else { return }\nlet modifiedText = regex.stringByReplacingMatches(\n in: text,\n range: NSRange(location: 0, length: text.count),\n withTemplate: replacement\n)\n\nprint(modifiedText) // Appelez au numéro [numéro masqué]\n\n