Introduction aux expressions régulières en Rust
\n\nLes expressions régulières (regex) sont un outil puissant pour rechercher, extraire et remplacer du texte selon un motif donné. En Rust, le crate regex est utilisé pour travailler avec les expressions régulières – l'une des bibliothèques les plus populaires et performantes de l'écosystème. Dans cet article, nous aborderons les bases de l'utilisation des regex en Rust, de l'installation aux exemples pratiques.
Pourquoi apprendre les expressions régulières en Rust ? Le langage offre un traitement du texte sûr et rapide, et le crate regex garantit l'absence de fuites mémoire et une vitesse d'exécution élevée. Cela fait de Rust un excellent choix pour l'analyse de logs, la validation de formulaires, le traitement de fichiers de configuration et d'autres tâches.
Installation et importation du crate regex
\n\nPour commencer, ajoutez la dépendance regex dans votre fichier Cargo.toml :
[dependencies]\nregex = "1.10"\n\nEnsuite, importez le module dans votre code :
\n\nuse regex::Regex;\n\nLa structure principale avec laquelle vous travaillerez est Regex. Vous pouvez créer une instance à l'aide de la méthode Regex::new(), qui retourne un Result, car le motif peut être invalide.
fn main() {\n let re = Regex::new(r"^\\d{3}-\\d{2}-\\d{4}$").unwrap();\n println!("Regex créé : {}", re.as_str());\n}\n\nRemarque : le motif est écrit en chaînes brutes (r"...") pour éviter l'échappement des barres obliques inverses.
Opérations de base avec les expressions régulières
\n\n1. Vérification de correspondance : is_match
\n\nLa méthode is_match retourne true si le motif est trouvé dans la chaîne :
use regex::Regex;\n\nfn main() {\n let re = Regex::new(r"hello").unwrap();\n let text = "hello world";\n \n if re.is_match(text) {\n println!("Correspondance trouvée !");\n } else {\n println!("Aucune correspondance");\n }\n}\n\nSortie : Correspondance trouvée !
2. Recherche de la première correspondance : find
\n\nLa méthode find retourne Option<Match> – la première correspondance avec des informations sur la position :
use regex::Regex;\n\nfn main() {\n let re = Regex::new(r"\\d+").unwrap();\n let text = "Code : 12345, prix : 678";\n \n if let Some(m) = re.find(text) {\n println!("Trouvé : '{}' (position {}..{})", m.as_str(), m.start(), m.end());\n }\n}\n\nSortie : Trouvé : '12345' (position 6..11)
3. Recherche de toutes les correspondances : find_iter
\n\nPour obtenir toutes les correspondances, utilisez l'itérateur find_iter :
use regex::Regex;\n\nfn main() {\n let re = Regex::new(r"\\d+").unwrap();\n let text = "Nombres : 42, 100, 7";\n \n for m in re.find_iter(text) {\n println!("Nombre : {}", m.as_str());\n }\n}\n\nSortie :
\nNombre : 42\nNombre : 100\nNombre : 7\n\n4. Extraction de groupes : captures
\n\nLes groupes dans le motif (indiqués par des parenthèses) permettent d'extraire des parties de la correspondance :
\n\nuse regex::Regex;\n\nfn main() {\n let re = Regex::new(r"(\\w+)@(\\w+)\\.(\\w+)").unwrap();\n let email = "user@example.com";\n \n if let Some(caps) = re.captures(email) {\n println!("Email complet : {}", &caps[0]);\n println!("Nom : {}", &caps[1]);\n println!("Domaine : {}", &caps[2]);\n println!("Zone : {}", &caps[3]);\n }\n}\n\nSortie :
\nEmail complet : user@example.com\nNom : user\nDomaine : example\nZone : com\n\nExemples pratiques d'utilisation
\n\nExemple 1 : Validation d'un numéro de téléphone
\n\nVérifions si une chaîne correspond au format d'un numéro russe (par exemple, +7-XXX-XXX-XX-XX) :
\n\nuse regex::Regex;\n\nfn v