IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Delphi Discussion :

Recherche de caractères spéciaux


Sujet :

Langage Delphi

  1. #1
    Futur Membre du Club
    Inscrit en
    Juin 2003
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 4
    Points : 5
    Points
    5
    Par défaut Recherche de caractères spéciaux
    Bonjour,

    J'ai une liste de chaine de caractères (Allo, BonjourAllo, Hello, Emballer) et j'aimerais permettre de faire une recherche dans cette liste avec les caractères de recherche "?"

    Si je fait une recherche de "?llo" il me sort les résultat (Allo, BonjourAllo, Hello)

    Si je fait une recherche de "a??o" il me sort les résultat (Allo, BonjourAllo)

    Etc....

    Connaissez-vous une fonction qui permet de faire cela.


    Merci bien
    Stéphane Bérubé

  2. #2
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Salut,
    voir les expressions régulières.

    Extrait de la prochaine FAQ Delphi
    Auteurs : Bruno75, BeTuLa, Tiki06


    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 :
    • ab?
      cdef*
      *xyz
      gh*op?w


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    qsdsdq.pas
    ; aeze.pas
    qsdsdq.txt; aeze.txt

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Toutes versions] rechercher/remplacer caractères spéciaux
    Par issoram dans le forum Excel
    Réponses: 2
    Dernier message: 22/06/2011, 14h22
  2. Recherche Imap Caractères spéciaux
    Par Sylv016 dans le forum Général Python
    Réponses: 1
    Dernier message: 06/06/2010, 22h57
  3. Problème de recherche de caractères spéciaux
    Par pikpik164 dans le forum Configuration
    Réponses: 3
    Dernier message: 08/12/2009, 10h37
  4. rechercher/remplacer caractères spéciaux
    Par MarLoZ dans le forum Word
    Réponses: 3
    Dernier message: 14/11/2007, 11h42
  5. [XPath] Problème pour rechercher des caractères spéciaux
    Par JolyLoic dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 13/12/2006, 13h41

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo