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

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Enseignant
    Inscrit en
    juin 2018
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Antigua-Barbuda

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : juin 2018
    Messages : 6
    Points : 8
    Points
    8

    Par défaut Expression régulière pour découper une chaîne

    Bonjour !

    J'essaye désespérément de créer une expression régulière qui me permette de découper ma chaîne avec SplitRegExpr de la manière suivante : "dès que tu vois un espace qui n'est pas précédé du caractère d'échappement "$" et qui n'est pas entre crochet, découpe". Il faudrait donc qu'il me découpe une chaîne comme "Bonjour Dupont !" en "Bonjour", "Dupont" et "!" mais qu'il ne découpe rien dans une chaîne telle que "Bonjour$ Jean$ [De La Tour].

    La difficulté ici ne réside pas tant dans le fait de ne pas découper lorsque l'espace est précédé du caractère d'échappement dollar mais à tester s'il est entouré de crochet (à noter que si du texte le sépare dudit crochet, ça ne change rien).

    Merci d'avance à l'âme charitable qui s'arrêtera pour m'aider !

  2. #2
    Membre expert Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    mars 2009
    Messages
    1 638
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : mars 2009
    Messages : 1 638
    Points : 3 425
    Points
    3 425

    Par défaut

    Utiliser un split n'est pas une bonne idée dans ce cas là, à cause des crochets principalement. Il est beaucoup plus simple et efficace de trouver tout ce qui ne se découpe pas que de chercher à voir si tu es entre crochets ou pas pour découper. Autrement dit, cherche tous les morceaux et pas les traits de coupe. Ça donnerait ça:
    Code regex : Sélectionner tout - Visualiser dans une fenêtre à part
    (?=[^ ])[^$\[ ]*(?:\[[^\]]*\][^$\[ ]*|\$.[^$\[ ]*)*

    Explications:
    Code regex : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    (?=[^ ]) # comme toute la suite de l expression est optionnelle (et peut donc matcher une chaîne vide),
    # ce test avant (lookahead) garantit qu il y a au moins un caractère qui ne soit pas un espace. Si tu veux aussi les parties vides entre deux espaces, retire le.
    [^$\[ ]* # tout ce qui n est pas un dollar un crochet ouvrant ou un espace.
    (?: # groupe non-capturant
        \[ [^\]]* \] [^$\[ ]* # une partie entre crochets, puis la sous pattern du début
      | # ou
        \$+. [^$\[ ]* # un ou plusieurs dollars suivis de n importe quel caractère, puis la sous pattern du début
    )* # on répète le groupe non capturant

    Pour être totalement rigoureux tu peux aussi gérer le cas des dollars ou du crochet ouvrant non fermé à la fin de la chaîne en ajoutant (?:\$$|\[[^\]]*$)? en fin de pattern.

    Si les crochets peuvent être imbriqués, c'est une autre paire de manches, donc n'hésite pas à le signaler.
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Enseignant
    Inscrit en
    juin 2018
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Antigua-Barbuda

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : juin 2018
    Messages : 6
    Points : 8
    Points
    8

    Par défaut

    Oui, les crochets sont supposés pouvoir être imbriqués. Mais quelle fonction dois-je utiliser avec cette expression si ce n'est pas Split ?

  4. #4
    Membre expert Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    mars 2009
    Messages
    1 638
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : mars 2009
    Messages : 1 638
    Points : 3 425
    Points
    3 425

    Par défaut

    Alors autant pour moi, car RegExpr ne semble pas supporter les tests avant (lookahead) ce qui à la limite n'est pas grave, mais par contre il ne faut pas non plus compter sur la récursion (qui permet de décrire des éléments imbriqués). Donc avec RegExpr tu ne pourras rien faire. J'ai cru voir qu'il existait un wrapper pour la bibliothèque PCRE qui elle est capable de faire ça avec une expression du type: (?=[^ ])[^$\[ ]*(?:\[([^][]|\[(?1)\])*\][^$\[ ]*|\$.[^$\[ ]*)*(?:\[.*$|\$$)?.

    Sinon une solution peut-être plus performante et qui ne nécessite pas de fouiller le net après ce wrapper, c'est de lire ta chaîne caractère par caractère, avec des tests conditionnels et une variable qui t'indique le niveau d'imbrication des crochets. Désolé d'avance pour ma faiblesse en Pascal, mais l'idée est:
    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
    var
      s: String;
      i: Integer;
      d: Integer = 0; // bracket depth
      e: Boolean = false; // escaped
     
    begin
      s := 'Ce matin un [lapin [a vu [un chasseur.] [C''était un] ]lapin] qui avait$ un fusil.';
     
      for i:=1 to Length(s) do
        begin
          case S[i] of
            '$':
              e := true;
     
            '[':
              begin
                d := d + 1;
                e := false;
              end;
            ']':
              begin
                if d > 0 then
                    d := d - 1;
                e := false;
              end;
     
            ' ':
              begin
                if (e = false) and (d = 0) then
                    writeln(i);
                e := false;
              end;
            else
              begin
                e := false;
              end;
          end;
        end;
      readln;
    end.
    Qui donne l'offset des espaces non échappés par un $ en dehors des crochets.
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Enseignant
    Inscrit en
    juin 2018
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Antigua-Barbuda

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : juin 2018
    Messages : 6
    Points : 8
    Points
    8

    Par défaut

    Oui, je pense que je vais effectivement utiliser la fonction pour lire et découper la chaîne caractère par caractère. Merci de ton aide !

  6. #6
    Membre expert Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    mars 2009
    Messages
    1 638
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : mars 2009
    Messages : 1 638
    Points : 3 425
    Points
    3 425

    Par défaut

    Attention, j'avais commis une erreur dans mon code précédent qui maintenant est corrigée (il fallait passer le flag d'échappement e a false dés qu'on rencontre un caractère différent de $).
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

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

Discussions similaires

  1. Expression régulière pour tester une adresse email
    Par Pascale38 dans le forum C++Builder
    Réponses: 1
    Dernier message: 06/02/2014, 13h56
  2. Cherche Expression rationnelle pour isoler une chaîne
    Par ritual dans le forum Shell et commandes GNU
    Réponses: 10
    Dernier message: 18/08/2008, 14h31
  3. Expression régulière pour remplacer une apostrophe
    Par syrius31 dans le forum Langage
    Réponses: 3
    Dernier message: 04/04/2008, 20h34
  4. expression régulière pour reconnaitre une inclusion de fichier en c++
    Par cdm1024 dans le forum Algorithmes et structures de données
    Réponses: 3
    Dernier message: 27/11/2007, 13h49
  5. Expression régulière pour récupérer une chaîne.
    Par z980x dans le forum java.util
    Réponses: 2
    Dernier message: 24/06/2007, 15h01

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