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

 Delphi Discussion :

Trouver si des caractères sont dans une chaîne


Sujet :

Delphi

  1. #21
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 345
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 345
    Points : 3 123
    Points
    3 123
    Par défaut
    Bonjour,

    avec beaucoup d'essais infructueux, vu mes faibles connaissances en expressions régulières, voici quelque chose qui semble fonctionner avec les lignes dans Memo1 et les résultats de la recherche dans Memo2

    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    {=======================================================================}
    procedure TForm1.Btn_ExpRegClick(Sender: TObject);
    var
      Expr         : TPerlRegex ;
      i            : integer ;
      Trouve       : Boolean ;
      MaLigne      : String  ;
      Mes13Chiffres: string  ;
      RegEx        : String  ;
    begin
      memo2.Clear;
      // Chargement des lignes de memo1
       Memo1.Clear ;
       Memo1.lines.add('0 - Ta12gadaTsoinTsoin5710364579451TrucMu795che' );
       Memo1.lines.add('1 - Ta12gadaTsoinTsoin5710364579451005TrucMu795che' );
       Memo1.lines.add('2 - a12gadaTsoinTsoin5710364579451TrucMu795che' );
       Memo1.lines.add('3 - Ta12gadaTsoinTsoin5710364579TrucMu795che' );
       Memo1.lines.add('4 - a12gadaTsoinTsoin5710364579451TrucMu795che' );
       Memo1.lines.add('5 - Ta12gadaTsoinTsoin5710364579451TrucMu795che' );
       Memo1.lines.add('61234567891234gadaTsoinTsoin5710364579451TrucMu795che' );
       Memo1.lines.add('7123456789123gadaTsoinTsoin5710364579451TrucMu795che' );
       Memo1.lines.add('8 - a1234567891234' );
       Memo1.lines.add('9 - a12345678912345678914579451TrucMu795che' );
       Memo1.lines.add('10 - aerte61234567891234' );
       Memo1.lines.add('11 - retey7123456789123' );
       Memo1.lines.add('12234567891234' );
       Memo1.lines.add('1323456789123' );
     
       // Recherche des codebars avec PerlRegEx
       RegEx := '^\d{13}(\D)|(^\d{13}$)|(\D\d{13})$|\D\d{13}\D' ;
     
       For i := 0 To Memo1.Lines.Count -1 Do
          Begin
            Expr := TPerlRegex.Create;
            Expr.Subject := utf8string(Memo1.Lines[i]) ;
            Expr.RegEx := RegEx ;
            Trouve := expr.Match ;
            If Trouve Then
               Begin
                  Mes13Chiffres := Expr.MatchedText ;
                  memo2.Lines.Add('Ligne '+ IntToStr(i)+ ' - ' + Mes13Chiffres );
               End ;              
            Expr.Free;
          End ;
    end;
    {=======================================================================}
    Il reste à épurer le résultat lorsqu'il comporte une lettre au début ou à la fin quand il y a 14 caractères.

    Peut être faudrait il sortir le Create et le Free de la boucle ?

    A+
    Charly

  2. #22
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 345
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 345
    Points : 3 123
    Points
    3 123
    Par défaut
    Voilà avec la chaine épurée et le create fait une seule fois :

    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    {=======================================================================}
    procedure TForm1.Btn_ExpRegClick(Sender: TObject);
    { ------------------------------------------- }
    Function  IsNumeric(Caractere : Char) : Boolean ;
    Var  OrdChar : Integer ;
    Begin
       OrdChar := ord(Caractere);
       Result := (OrdChar >= 48) And (OrdChar <= 57) ;
    End ;
    { ------------------------------------------- }
    var
      Expr         : TPerlRegex ;
      i            : integer ;
      Trouve       : Boolean ;
      MaLigne      : String  ;
      Mes13Chiffres: string  ;
      RegEx        : String  ;
    begin
      memo2.Clear;
      // Chargement des lignes de memo1
       Memo1.Clear ;
       Memo1.lines.add('0 - Ta12gadaTsoinTsoin5710364579451TrucMu795che' );
       Memo1.lines.add('1 - Ta12gadaTsoinTsoin5710364579451005TrucMu795che' );
       Memo1.lines.add('2 - a12gadaTsoinTsoin5710364579451TrucMu795che' );
       Memo1.lines.add('3 - Ta12gadaTsoinTsoin5710364579TrucMu795che' );
       Memo1.lines.add('4 - a12gadaTsoinTsoin5710364579451TrucMu795che' );
       Memo1.lines.add('5 - Ta12gadaTsoinTsoin5710364579451TrucMu795che' );
       Memo1.lines.add('61234567891234gadaTsoinTsoin5710364579451TrucMu795che' );
       Memo1.lines.add('7123456789123gadaTsoinTsoin5710364579451TrucMu795che' );
       Memo1.lines.add('8 - a1234567891234' );
       Memo1.lines.add('9 - a12345678912345678914579451TrucMu795che' );
       Memo1.lines.add('10 - aerte61234567891234' );
       Memo1.lines.add('11 - retey7123456789123' );
       Memo1.lines.add('12234567891234' );
       Memo1.lines.add('1323456789123' );
     
       // Recherche des codes bar avec PerlRegEx
       RegEx := '^\d{13}(\D)|(^\d{13}$)|(\D\d{13})$|\D\d{13}\D' ;
       Expr := TPerlRegex.Create;
       For i := 0 To Memo1.Lines.Count -1 Do
          Begin
            Expr.Subject := utf8string(Memo1.Lines[i]) ;
            Expr.RegEx := RegEx ;
            Trouve := expr.Match ;
            If Trouve Then
               Begin
                  Mes13Chiffres := Expr.MatchedText ;
                  If (not IsNumeric(Mes13Chiffres[1])) Then Delete(Mes13Chiffres, 1 , 1) ; 
                  If (not IsNumeric(Mes13Chiffres[Length(Mes13Chiffres)])) Then
                        Delete(Mes13Chiffres, Length(Mes13Chiffres), 1) ;
                  memo2.Lines.Add('Ligne '+ IntToStr(i)+ ' - ' + Mes13Chiffres );
               End ;
          End ;
       Expr.Free ;
    End;
    {=======================================================================}
    A+
    Charly

  3. #23
    Membre expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    661
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2006
    Messages : 661
    Points : 3 630
    Points
    3 630
    Billets dans le blog
    2
    Par défaut
    Bonsoir,

    Alors voilà une modification du code que j'avais fourni avec les expressions régulières qui fonctionnent avec les lignes exemples de Charly910

    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
    var
      expr: TRegEx;
      collection: TMatchCollection;
      i : integer;
    begin
       // On efface le contenu du mémo des résultats
      memo2.Clear;
     
      // Expression régulière à rechercher : (un caractère début de ligne ou nouvelle ligne ou non numérique) suivi de (13 caractères numériques) suivi (d'un caractère non numérique ou de la fin de ligne)
      // on crée 3 "blocs" avec les parenthèses car le premier ("bloc 1") et le dernier ("bloc 3") caractères ne devront pas faire partie du résultat final
      expr.Create('(^|\n|\D)(\d{13})(\D|$)');
     
      // Lancement de la recherche qui impacte tout le contenu de memo1
      collection := expr.Matches(Memo1.Lines.Text);
     
      // On parcourt la collection, et on met dans memo2 le "bloc 2" des valeurs qui ont "matché" avec l'expression régulière
      for i := 0 to collection.Count - 1 do
          memo2.Lines.Add(expr.Replace(collection[i].Value, '\2'));
     
    end;
    Mon site - Mes tutoriels - GitHub - N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  4. #24
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 043
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 043
    Points : 40 957
    Points
    40 957
    Billets dans le blog
    62
    Par défaut
    Bonjour,

    merci gbegreg ,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (^|\n|\D)(\d{13})(\D|$)
    Apprendre une nouvelle chose dès le début de la journée est une bonne journée, je ne connaissais pas cette possibilité de syntaxe c'est certes plus joli que ce que j'avais tenté
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  5. #25
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 345
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 345
    Points : 3 123
    Points
    3 123
    Par défaut
    Oui, l'expression fournie par gbegreg fonctionne bien avec PerlRegEx
    A+
    Charly

Discussions similaires

  1. Problème avec des caractères spéciaux dans une chaine
    Par thibaut06 dans le forum Général JavaScript
    Réponses: 11
    Dernier message: 20/11/2006, 16h46
  2. [C#] Comment insérer des retours chariot dans une chaine de caractère ?
    Par tazmania dans le forum Accès aux données
    Réponses: 4
    Dernier message: 30/10/2006, 09h27
  3. Réponses: 3
    Dernier message: 24/04/2006, 15h53
  4. Réponses: 11
    Dernier message: 25/09/2005, 21h20
  5. Réponses: 2
    Dernier message: 12/01/2004, 13h56

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