Expressions régulières en TypeScript : syntaxe, méthodes et exemples
Les expressions régulières (regex) sont un outil puissant pour travailler avec les chaînes de caractères. En TypeScript, elles permettent non seulement de rechercher, remplacer et vérifier du texte, mais aussi d'obtenir un typage strict des résultats. Dans cet article, nous allons aborder tous les aspects du travail avec RegExp en TypeScript : de la syntaxe de base aux techniques avancées avec des exemples de code.
1. Création d'expressions régulières en TypeScript
En TypeScript, comme en JavaScript, il existe deux façons de créer une expression régulière :
Syntaxe littérale
La méthode la plus courante et pratique consiste à utiliser des barres obliques :
const pattern: RegExp = /hello/gi;Ici, g signifie recherche globale, i signifie insensibilité à la casse. Le type RegExp est déduit automatiquement, mais on peut le spécifier explicitement pour la lisibilité.
Constructeur RegExp
Utilisé lorsque le motif est formé dynamiquement :
const searchTerm: string = "world";const dynamicPattern: RegExp = new RegExp(searchTerm, "gi");Le deuxième argument est une chaîne contenant les drapeaux. Le type de la valeur retournée est RegExp.
2. Méthodes principales de RegExp et String
TypeScript hérite de toutes les méthodes de JavaScript, mais y ajoute un typage strict. Examinons les méthodes clés avec des exemples.
Méthode test()
Vérifie s'il y a une correspondance dans la chaîne. Retourne boolean.
const emailRegex: RegExp = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$/;const email: string = "user@example.com";
const isValid: boolean = emailRegex.test(email);console.log(isValid); // trueMéthode exec()
Recherche une correspondance et retourne des informations détaillées. Retourne RegExpExecArray | null.
const text: string = "Prix : 1500 roubles, réduction : 200 roubles";const pricePattern: RegExp = /(\\d+)\\s*roubles/g;
let match: RegExpExecArray | null;while ((match = pricePattern.exec(text)) !== null) { console.log(`Trouvé : ${match[0]}, nombre : ${match[1]}`);}// Affichage :// Trouvé : 1500 roubles, nombre : 1500// Trouvé : 200 roubles, nombre : 200Méthode match() de la chaîne
Fonctionne de manière similaire à exec(), mais est appelée sur la chaîne. Retourne RegExpMatchArray | null.
const phone: string = "Contacts : +7 (999) 123-45-67";const phoneRegex: RegExp = /\\+7\\s*\\(\\d{3}\\)\\s*\\d{3}-\\d{2}-\\d{2}/;
const result: RegExpMatchArray | null = phone.match(phoneRegex);if (result) { console.log(`Téléphone trouvé : ${result[0]}`); // Téléphone trouvé : +7 (999) 123-45-67}Méthode replace()
Remplace les correspondances par une nouvelle chaîne. Retourne string. Prend en charge un callback pour les remplacements complexes.
function formatDate(input: string): string { const datePattern: RegExp = /(\\d{4})-(\\d{2})-(\\d{2})/; return input.replace(datePattern, "$3.$2.$1");}
const isoDate: string = "2025-03-10";const formatted: string = formatDate(isoDate);console.log(formatted); // "10.03.2025"Méthode split()
Divise une chaîne selon une expression régulière. Retourne string[].
const data: string = "pomme;poire;orange;banane";const items: string[] = data.split(/;\\s*/);console.log(items); // ["pomme", "poire", "orange", "banane"]3. Drapeaux et leurs combinaisons
Les drapeaux contrôlent le comportement de l'expression régulière. En TypeScript, ils sont définis soit dans le littéral, soit comme deuxième argument du constructeur.
| Drapeau | Description | Exemple |
|---|---|---|
g | Recherche globale (toutes les correspondances) | /ab/g |
i | Insensibilité à la casse | /ab/i |
m | Mode multiligne | /^ab/m |
s | Le point correspond également au saut de ligne | /ab./s |
u | Mode Unicode complet | /\\p{L}/u |
y | Recherche collante (à partir de la position actuelle) | /ab/y |
Les drapeaux peuvent être combinés : /pattern/giu ou new RegExp("pattern", "giu").
4. Groupes et captures
Les groupes dans les expressions régulières permettent d'extraire des parties spécifiques d'une correspondance. En TypeScript, les groupes capturants sont typés comme des éléments de tableau.
Groupes nommés
TypeScript prend en charge les groupes nommés, ce qui rend le code plus lisible :
function parseUrl(url: string): { protocol: string; domain: string; path: string } | null { const urlPattern: RegExp = /^(?https?):\\/\\/(?[^\\/]+)(?\\/.*)?$/; const match = urlPattern.exec(url); if (match?.groups) { return { protocol: match.groups.protocol, domain: match.groups.domain, path: match.groups.path || '/' }; } return null;}
const url: string = "https://example.com/page";const parsed = parseUrl(url);console.log(parsed);// { protocol: 'https', domain: 'example.com', path: '/page' } Groupes non capturants
Utilisés pour le regroupement sans sauvegarde dans le résultat :
const pattern: RegExp = /(?:https?):\\/\\/(?:www\\.)?([^\\/]+)/;const result = pattern.exec("https://www.example.com");console.log(result?.[1]); // "example.com"5. Assertions
Les assertions vérifient une condition sans inclure les caractères dans la correspondance.
Assertions de début et de fin
const startPattern: RegExp = /^Hello/; // La chaîne commence par "Hello"const endPattern: RegExp = /world!$/; // La chaîne se termine par "world!"
console.log(startPattern.test("Hello world!")); // trueconsole.log(endPattern.test("Hello world!")); // trueAssertions de contexte (lookahead et lookbehind)
// Lookahead positif : trouve "px" seulement s'il est suivi d'un nombreconst lookaheadPattern: RegExp = /\\d+(?=px)/;console.log("Largeur : 100px".match(lookaheadPattern)?.[0]); // "100"
// Lookbehind négatif : trouve "chat" seulement s'il n'est pas précédé de "gros "const lookbehindPattern: RegExp = /(?6. Expressions régulières et typage strict
TypeScript permet de créer des wrappers typés pour les expressions régulières fréquemment utilisées :
interface EmailValidation { isValid: boolean; domain?: string; localPart?: string;}
function validateEmail(email: string): EmailValidation { const emailRegex: RegExp = /^(?[^@]+)@(?[^@]+\\.[^@]+)$/; const match = emailRegex.exec(email); if (match?.groups) { return { isValid: true, domain: match.groups.domain, localPart: match.groups.local }; } return { isValid: false };}
const result = validateEmail("user@example.com");console.log(result.domain); // "example.com" 7. Pièges courants et optimisation
Échappement des caractères
En TypeScript, n'oubliez pas d'échapper les barres obliques inverses dans les chaînes :
// Correctconst pattern1: RegExp = new RegExp("\\\\d+");
// Également correct (littéral)const pattern2: RegExp = /\\d+/;Rétro-traçage catastrophique
Évitez les motifs qui peuvent provoquer un ralentissement :
// Problématique - peut bloquer le navigateurconst badPattern: RegExp = /(a+)+b/;
// Optimiséconst goodPattern: RegExp = /a+b/;Réutilisation des expressions régulières
Créez les expressions régulières en dehors des boucles pour améliorer les performances :
// Inefficacefunction findNumbersBad(texts: string[]): number[] { return texts.flatMap(t => t.match(/\\d+/g) || []);}
// Efficaceconst numberRegex: RegExp = /\\d+/g;function findNumbersGood(texts: string[]): number[] { return texts.flatMap(t => t.match(numberRegex) || []);}Conclusion
Les expressions régulières en TypeScript offrent les mêmes possibilités qu'en JavaScript, mais avec les avantages du typage statique. L'utilisation correcte des types RegExp, RegExpExecArray et RegExpMatchArray permet d'éviter les erreurs à la compilation. Les groupes nommés et les wrappers typés rendent le code plus sûr et plus facile à maintenir.
Pratiquez avec différents motifs et n'oubliez pas de tester les cas limites. Les expressions régulières sont un outil puissant qui, utilisé correctement, peut considérablement simplifier le traitement des chaînes de caractères dans vos projets TypeScript.