Expressions régulières en Kotlin : guide complet avec exemples
Les expressions régulières (regex) sont un outil puissant pour rechercher, extraire et remplacer du texte selon un modèle. En Kotlin, le travail avec les regex est implémenté via la classe Regex, qui fournit une API pratique et une compatibilité totale avec l'implémentation Java java.util.regex.Pattern. Dans cet article, nous allons analyser tous les aspects de l'utilisation des expressions régulières en Kotlin avec des exemples concrets.
1. Création et utilisation de base de Regex en Kotlin
En Kotlin, il existe deux façons principales de créer une expression régulière :
- Constructeur de la classe
Regex— vous passez une chaîne avec le modèle. - Méthode d'extension
.toRegex()— appelée sur une chaîne.
Exemples de création :
// Méthode 1 : constructeurval regex1 = Regex("\\\\d{3}-\\\\d{2}-\\\\d{4}")
// Méthode 2 : toRegex()val regex2 = "\\\\d{3}-\\\\d{2}-\\\\d{4}".toRegex()
// Avec des drapeaux (recherche insensible à la casse)val regex3 = Regex("hello", RegexOption.IGNORE_CASE)
// Mode multiligneval regex4 = Regex("^start", RegexOption.MULTILINE)Notez : en Kotlin, comme en Java, pour échapper l'antislash, on utilise un double antislash \\\\. Si vous écrivez \\d — vous devez écrire "\\\\d".
2. Fonctions principales de Regex : vérification, recherche, remplacement
La classe Regex fournit plusieurs fonctions clés pour travailler avec les chaînes.
2.1. Vérification de correspondance complète — matches()
La fonction matches() retourne true si la chaîne entière correspond au modèle.
val emailRegex = Regex("[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\\\.[a-zA-Z]{2,}")
val email1 = "user@example.com"val email2 = "invalid-email"
println(emailRegex.matches(email1)) // trueprintln(emailRegex.matches(email2)) // false2.2. Recherche de la première correspondance — find()
Retourne la première correspondance trouvée sous forme d'objet MatchResult? (ou null si rien n'est trouvé).
val text = "Mon téléphone : 123-45-6789 et aussi 987-65-4321"val phoneRegex = Regex("\\\\d{3}-\\\\d{2}-\\\\d{4}")
val firstMatch = phoneRegex.find(text)if (firstMatch != null) { println("Téléphone trouvé : ${firstMatch.value}") // Téléphone trouvé : 123-45-6789 println("Début : ${firstMatch.range.first}") // Début : 16}2.3. Recherche de toutes les correspondances — findAll()
Retourne une séquence Sequence<MatchResult> de toutes les correspondances non chevauchantes.
val text = "Prix : 100 roubles, 250 roubles, 50 roubles"val priceRegex = Regex("\\\\d+")
val prices = priceRegex.findAll(text)prices.forEach { match -> println("Prix : ${match.value}")}// Sortie :// Prix : 100// Prix : 250// Prix : 502.4. Remplacement par modèle — replace()
La fonction replace() remplace toutes les correspondances trouvées par la chaîne spécifiée ou le résultat d'une expression lambda.
val text = "Mon email : john@mail.com et support@site.org"val emailRegex = Regex("[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\\\.[a-zA-Z]{2,}")
// Remplacement simpleval masked = emailRegex.replace(text, "[EMAIL CACHÉ]")println(masked) // Mon email : [EMAIL CACHÉ] et [EMAIL CACHÉ]
// Remplacement avec lambda (dynamique)val replaced = emailRegex.replace(text) { match -> val local = match.value.split("@")[0] "${local.first()}***@***"}println(replaced) // Mon email : j***@*** et s***@***2.5. Division de chaîne — split()
Divise la chaîne selon les correspondances avec l'expression régulière.
val text = "pomme,poire;banane|orange"val separators = Regex("[,;|]")
val fruits = separators.split(text)println(fru