Comment utiliser les expressions régulières avec Delphi ?
On entend par expression régulière le fait d'appliquer un filtre particulier sur une chaîne ou ensemble de chaînes de caractères ou encore sur des fichiers ASCII.
Ce filtre contiendra des caractères ayant une signification particulière dans ce contexte.
Il existe plusieurs approches :
La fonction MatchesMask
Elle est sans doute la fonction la plus méconnue de Delphi. L'aide de Delphi spécifie clairement que cette fonction ne gère pas seulement les noms de fichier. On peut donc l'utiliser sur des textes.
Voici un exemple qui vérifie si un dossier correspond à une liste de filtres différents stockés dans un
TStringlist.
Si le nom du dossier correspond au masque, le chemin complet du dossier est ajouté dans un autre
TStringlist.
La liste des filtres peut ressembler à ceci :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
|
Var S : String;
Masque, //Liste des filtres différents
Liste : TStringList; //Liste de dossiers correspondant aux filtres
begin
...
//où Nom est le nom du dossier
S := Nom + '\';
For i := 0 to Masque.Count - 1 Do
If MatchesMask(s, '*\' + Masque[i] + '\*') Then
begin
Liste.Add(Nom + '\');
Break; //Pour ne pas avoir 2 fois le nom du dossier
end; |
Les caractères génériques utilisables sont
* et
? . On peut également utiliser des ensembles et des intervalles.
Il faut nécessairement déclarer l'unité
Masks dans la clause uses.
Le composant TRegExpr
Un
composant Delphi dédié à la gestion des expressions régulières.
Microsoft VBScript Regular Expressions 5.5
C'est un composant COM utilisable après un import dans Delphi.
En fait ce composant déclare parfois des interfaces
IDispatch au lieu de déclarer des types spécifiques. C'est pourquoi le concepteur du wrapper pour PCRE a également écrit un wrapper pour Microsoft VBScript Regular Expressions 5.5.
Téléchargement du Wrapper.
Les wrappers (Microsoft et PCRE) fonctionnent avec des interfaces notamment pour la gestion de la mémoire.
Voici
une documentation Microsoft sur les patterns qui contient également un exemple d'utilisation.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
|
uses
VBScriptRegex
...
procedure TForm1.Button1Click(Sender: TObject);
var
re: IRegex;
mc: IMatchCollection;
iMatch: Integer;
resultat: string;
begin
// Find
re := Regex.Create('([^\.]*)\.pas');
mc := re.FindAll('qsdsdq.pas; aeze.pas');
for iMatch := 0 to mc.Count - 1 do
begin
Memo1.Lines.Add(mc.Item[iMatch].Value);
end;
// Replace
resultat := re.ReplaceAll('qsdsdq.pas; aeze.pas', '$1.txt');
Memo1.Lines.Add(resultat);
end; |
Résultat :
1 2 3 4
|
qsdsdq.pas
; aeze.pas
qsdsdq.txt; aeze.txt |
PCRE, Perl Compatible Regular Expressions
Il s'agit d'une bibliothèque C packagée pour Delphi et Delphi.NET disponible sur ce
site.
Une
documentation sur les patterns de PCRE.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
|
procedure TForm1.Button1Click(Sender: TObject);
var
re: IRegex;
mc: IMatchCollection;
iMatch: Integer;
resultat: string;
begin
// Find
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;
// Replace
resultat := re.Replace('qsdsdq.pas; aeze.pas', '$1.txt');
Memo1.Lines.Add(resultat);
end; |
Résultat :
1 2 3 4
|
qsdsdq.pas
; aeze.pas
qsdsdq.txt; aeze.txt |
Partager