FAQ DelphiConsultez toutes les FAQ
Nombre d'auteurs : 124, nombre de questions : 934, dernière mise à jour : 23 octobre 2024 Ajouter une question
Cette FAQ a été réalisée à partir des questions fréquemment posées sur les forums Delphi et Delphi et bases de données de www.developpez.com et de l'expérience personnelle des auteurs.
Nous tenons à souligner que cette FAQ ne garantit en aucun cas que les informations qu'elle propose soient correctes. Les auteurs font le maximum, mais l'erreur est humaine. Cette FAQ ne prétend pas non plus être complète. Si vous souhaitez y apporter des corrections ou la compléter, contactez un responsable (lien au bas de cette page).
Nous espérons que cette FAQ saura répondre à vos attentes. Nous vous en souhaitons une bonne lecture.
L'équipe Delphi de Developpez.com.
- Comment utiliser les expressions régulières avec Delphi ?
- Comment utiliser la fonction MatchesMask ?
- Comparer une chaîne à un motif avec la classe TRegEx de l'unité RegularExpressions
- Extraire les multiples occurrences d'un motif avec la classe TRegEx de l'unité RegularExpressions
- Comparer une chaîne à un motif avec la classe TPerlRegEx de l'unité PerlRegEx
- Extraire les multiples occurrences d'un motif avec la classe TPerlRegEx de l'unité PerlRegEx
- Comparer une chaîne à un motif avec la classe IRegex de l'unité PCRE
- Extraire les multiples occurrences d'un motif avec la classe IRegex de l'unité PCRE
- Test de validité d'une adresse e-mail
Il y a plusieurs façons d'utiliser les expressions régulières avec Delphi.
Si vous possédez Delphi XE ou une version postérieure, le plus simple est d'utiliser l'unité System.RegularExpressions.
Si vous possédez une version antérieure à Delphi XE, plusieurs possibilités s'offrent à vous. Le choix peut-être le plus recommandable est d'utiliser la classe TPerlRegEx de l'unité PerlRegEx. L'avantage de cette unité est d'être identique à l'unité System.RegularExpressionsCore livrée avec les versions récentes de Delphi (à partir de Delphi XE). Votre code sera donc réutilisable en cas de migration vers une version plus récente.
Une autre possibilité est d'utiliser la classe TRegExpr de l'unité RegExpr. L'avantage de cette unité est d'être identique à l'unité du même nom livrée avec Free Pascal. Toutefois cette unité n'est pas compatible avec les versions récentes de Delphi.
Une autre possibilité encore est d'utiliser la classe IRegex de l'unité PCRE. Il s'agit d'une unité pour Delphi 7, qui peut également être compilée avec Free Pascal.
Une autre possibilité enfin est d'utiliser la classe TFLRE de l'unité FLRE. L'avantage de cette bibliothèque est, outre sa rapidité, le fait qu'elle soit compatible aussi bien avec Delphi ancienne et nouvelle génération qu'avec Free Pascal.
La fonction MatchesMask de l'unité System.Masks indique si un nom de fichier est conforme au format spécifié par une chaîne filtre.
Code : | Sélectionner tout |
function MatchesMask(const Filename, Mask: string): Boolean;
Un caractère littéral correspond à un et un seul caractère de la chaîne examinée. La comparaison des caractères littéraux est insensible à la casse.
Un ensemble commence par un crochet ouvrant ([) et se termine par un crochet fermant (]). Entre les crochets se trouvent les éléments de l'ensemble. Chaque élément est un caractère littéral ou un intervalle. Les intervalles sont spécifiés par une valeur initiale, un trait d'union (-) et une valeur finale. N'utilisez ni espaces ni virgules pour séparer les éléments de l'ensemble. Un intervalle correspond à un et un seul caractère de la chaîne examinée. Un caractère appartient à un ensemble s'il est identique à l'un des caractères littéraux de l'ensemble ou s'il est compris dans l'un des intervalles de l'ensemble. Un caractère est compris dans un intervalle s'il est identique à la valeur initiale, ou à la valeur finale, ou à une valeur intermédiaire. Les comparaisons sont insensibles à la casse. Si le premier caractère après le crochet ouvrant est un point d'exclamation (!), l'ensemble représente tous les caractères n'appartenant pas à l'ensemble.
Les métacaractères sont l'astérisque (*) et le point d'interrogation (?). Un astérisque représente un nombre quelconque de caractères quelconques. Le point d'interrogation représente un et un seul caractère quelconque.
MatchesMask renvoie true si la chaîne examinée est conforme au masque, false dans le cas contraire. MatchesMask déclenche une exception si le masque lui-même n'est pas valide d'un point de vue syntaxique.
Code : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | program MatchesMask1; {$APPTYPE CONSOLE} uses SysUtils, Masks; const NAME = 'fichier1.ext'; begin WriteLn(MatchesMask(NAME, 'FICHIER1.EXT')); { Pas de différence entre majuscules et minuscules. } WriteLn(MatchesMask(NAME, 'fichier[12].ext')); { Ensemble contenant '1' et '2'. } WriteLn(MatchesMask(NAME, 'fichier[0-3].ext')); { Ensemble contenant les caractères de '0' à '3'. } WriteLn(MatchesMask(NAME, '*.ext')); { Un nombre indéfini de caractères quelconques. } WriteLn(MatchesMask(NAME, 'fichier?.ext')); { Un caractère quelconque. } WriteLn(MatchesMask(NAME, 'fichier1*.ext')); { Un nombre indéfini, y compris zéro. } WriteLn(MatchesMask(NAME, 'fichier1?.ext') = FALSE); { Un et un seul caractère. } WriteLn(MatchesMask(NAME, 'fichier[!0].ext')); { Un caractère qui n'est pas '0'. } ReadLn; end. |
La fonction IsMatch de la classe TRegEx indique si une chaîne de caractère donnée (ou l'une de ses parties) appartient à l'ensemble défini par une expression régulière.
Code : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | program RegularExpressions1; {$APPTYPE CONSOLE} uses System.RegularExpressions; begin WriteLn(TRegEx.IsMatch('bonjour', '\w')); { un caractère alphanumérique } WriteLn(TRegEx.IsMatch('bonjour', '\w+')); { un ou plusieurs caractères alphanumériques } WriteLn(TRegEx.IsMatch('bonjour', '\w*')); { zéro ou plus } WriteLn(TRegEx.IsMatch('bonjour', '\w{7}')); { sept } WriteLn(TRegEx.IsMatch('bonjour', '[a-z]{7}')); { sept minuscules } WriteLn(TRegEx.IsMatch('bonjour', '\d') = FALSE); { un chiffre } WriteLn(TRegEx.IsMatch('bonjour', '\s') = FALSE); { un espace au sens large } WriteLn(TRegEx.IsMatch('bonjour', '\D')); { un caractère qui n'est pas un chiffre } ReadLn; end. |
Code : | Sélectionner tout |
1 2 | WriteLn(TRegEx.IsMatch('bonjour', '^\w$') = FALSE); { Il y a plus d'un caractère alphanumérique entre le début et la fin de la chaîne. } |
Pour extraire les multiples occurrences d'un motif dans une chaîne, on utilise une variable de type TMatch, en combinaison avec les fonctions Match et NextMatch de la classe TRegEx.
L'exemple suivant extrait les nombres d'une chaîne donnée.
Code : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | program RegularExpressions2; {$APPTYPE CONSOLE} uses System.SysUtils, System.RegularExpressions; var match: TMatch; begin match := TRegEx.Match('10 +10 0.5 .5', '\s*[-+]?[0-9]*\.?[0-9]+\s*'); while match.Success do begin WriteLn(match.Value); match := match.NextMatch; end; ReadLn; end. |
L'unité PerlRegEx est identique à l'unité RegularExpressionsCore livrée avec Delphi à partir de la version XE. Le même code peut donc être compilé avec l'une ou l'autre de ces unités.
Voici un programme qui indique si un motif donné (en l'occurrence une date) se trouve dans une chaîne.
Code : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | program PerlRegEx1; {$APPTYPE CONSOLE} uses SysUtils, {$IF CompilerVersion >= 22.0} RegularExpressionsCore; {$ELSE} PerlRegEx; (* http://www.regular-expressions.info/download/TPerlRegEx.zip *) {$IFEND} var expr: TPerlRegEx; begin expr := TPerlRegEx.Create; expr.Subject := '10/12/2015'; expr.RegEx := '\d{2}/\d{2}/\d{4}'; if expr.Match then WriteLn(expr.MatchedText); expr.Free; ReadLn; end. |
Pour extraire les multiples occurrences d'un motif dans une chaîne, on utilise les fonctions Match et MatchAgain.
Code : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | program PerlRegEx2; {$APPTYPE CONSOLE} uses SysUtils, Classes, {$IF CompilerVersion >= 22.0} RegularExpressionsCore; {$ELSE} PerlRegEx; (* http://www.regular-expressions.info/download/TPerlRegEx.zip *) {$IFEND} var expr: TPerlRegEx; begin expr := TPerlRegEx.Create; expr.RegEx := '\d{2}/\d{2}/\d{4}'; expr.Subject := '10/12/2015 11/12/2015'; if expr.Match then repeat WriteLn(expr.MatchedText); until not expr.MatchAgain; expr.Free; ReadLn; end. |
Pour chercher un motif dans une chaîne de caractères sans extraire la sous-chaîne correspondante, on utilise la méthode IsMatch() de la classe IRegex.
Code : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 | uses pcre; { http://renatomancuso.com/software/dpcre/dpcre.htm } var regex: IRegex; begin regex := RegexCreate('^\d{4}$'); WriteLn(regex.IsMatch('2016')); // TRUE end. |
Pour extraire d'une chaîne les multiples occurrences d'un motif, la première solution est de relancer la recherche autant de fois que nécessaire, en passant à la méthode Match(), comme second paramètre, la position à partir de laquelle la recherche doit commencer.
Code : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | uses pcre; var aiguille, meule_de_foin: ansistring; regex: IRegex; resultat: IMatch; position: longint; begin aiguille := '\d'; meule_de_foin := '_2_0_1_6_'; regex := RegexCreate(aiguille); position := 0; resultat := regex.Match(meule_de_foin, position); while resultat.Success do begin WriteLn(resultat.Value); position := resultat.Groups[0].Index + resultat.Groups[0].Length; resultat := regex.Match(meule_de_foin, position); end; end. |
Code : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | procedure TForm1.Button1Click(Sender: TObject); var re: IRegex; mc: IMatchCollection; iMatch: Integer; resultat: string; begin re := RegexCreate('([^\.]*)\.pas'); mc := re.Matches('qsdsdq.pas; aeze.pas'); for iMatch := 0 to mc.Count - 1 do begin Memo1.Lines.Add(mc.Items[iMatch].Value); end; end; |
Bonjour,
je propose une nouvelle FAQ :
Dans la catégorie : Expressions régulières
Titre : Test de validité d'une adresse e-mail
Pour tester la validité d'une adresse mail, on peut utiliser les expressions régulière.
Cette fonction renvoie True si l'adresse est valide :
Code : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | Uses {$IF CompilerVersion >= 22.0} RegularExpressionsCore ; // pour Delphi XE et supérieur {$ELSE} PerlRegex ; // sur http://www.regular-expressions.info/download/TPerlRegEx.zip {$IFEND} ... Function IsValidMail(const s: string): boolean; // Test de la validité d'une adresse e-mail Const RegEmail = '[_a-zA-Z\d\-\.]+@([_a-zA-Z\d\-]+(\.[_a-zA-Z\d\-]+)+)'; Var Expr: TPerlRegex; Begin Result := False ; Expr := TPerlRegex.Create; Try Expr.Subject := utf8string(s); Expr.RegEx := RegEmail ; Result := Expr.Match; Finally Expr.Free; End; End; |
Proposer une nouvelle réponse sur la FAQ
Ce n'est pas l'endroit pour poser des questions, allez plutôt sur le forum de la rubrique pour çaLes sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2024 Developpez Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.