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 Perl Discussion :

Découpe en tenant compte d'un caractère d'échappement


Sujet :

Langage Perl

  1. #1
    Candidat au Club
    Inscrit en
    Juillet 2007
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 9
    Points : 3
    Points
    3
    Par défaut Découpe en tenant compte d'un caractère d'échappement
    Bonjour,

    Je bloque depuis quelques heures déjà sur un split, qui pourtant parait faisable !
    La difficulté, c'est que dans ma chaine, le séparateur est "+" et le caractère d'échappement est "?" (j'ai pas choisi !).

    Exemples concrets de ce que je dois obtenir :

    "aaa+bbb+ccc" => ("aaa","bbb","ccc")
    "aaa?+bbb+ccc" => ("aaa?+bbb","ccc") ou même ("aaa+bbb","ccc")

    L'important, c'est que le + ne soit pas interprété s'il est précédé d'un ?
    J'ai essayé pas mal de truc, dont [^?]+ mais ca me bouffe systématiquement mes caractères qui précede les + (forcément !).

    Si quelqu'un a une piste avant que je devienne fou !

    Merci.

  2. #2
    Membre actif Avatar de brice45
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    188
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 188
    Points : 236
    Points
    236
    Par défaut
    Bonjour,

    Ton signe + est considéré comme quantificateur. Fais plutôt cela :


  3. #3
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Points : 12 256
    Points
    12 256
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    la commande complète:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my @resultat = split /[^?]\+/, $ma_variable;

  4. #4
    Candidat au Club
    Inscrit en
    Juillet 2007
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 9
    Points : 3
    Points
    3
    Par défaut
    Bonjour,

    J'utilise bien la caractère \ :
    C'est vrai que je ne l'ai pas mis dans mon premier post.
    Mais en faisant ça, je découpe sur une sous chaine de 2 caractères, donc j'obtiens la liste :
    ("aaa?+bb","ccc")

    Je perds le caractère b qui précede +. Logique car [^?]\+ c'est bien 2 caractères.

  5. #5
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Points : 12 256
    Points
    12 256
    Billets dans le blog
    1
    Par défaut
    En y réfléchissant, c'est effectivement assez complexe, finalement.

    Je pense qu'une référence arrière négative de longueur nulle est sans doute la solution.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my @resultat = split /(?<!\?)\+/, $variable;
    Un bref essai m'a montré que "aaa+bbb+ccc" était bien splitté en trois morceaux de trois lettres, alors que "aaa?+bbb?+ccc" n'est pas splitté. A tester un peu plus en détail.

  6. #6
    Candidat au Club
    Inscrit en
    Juillet 2007
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 9
    Points : 3
    Points
    3
    Par défaut
    Exact ! Ca fonctionne.
    J'ai fait pas mal de tests, ils semblent concluants.
    Par contre, je ne suis pas contre une explication sur la partie les références arrières, pour moi, ca se fait avec des \1 \2. Je ne comprends pas trop ta syntaxe. C'est le '<' qui permet de revenir un caractère en arrière ?

    En tous cas, merci pour la solution !

  7. #7
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Points : 12 256
    Points
    12 256
    Billets dans le blog
    1
    Par défaut
    Le terme correct est semble-t-il plutôt assertion arrière négative de longueur nulle (et non référence comme j'avais écrit).

    La syntaxe est: (?<!...), les points de suspension devant être remplacés par le caractère qu'il ne faut pas trouver avant ce qui suit pour que la reconnaissance soit correcte (ici \? pour ne pas reconnaître un "?").

    La version positive est: (?<=...), les points de suspension indiquant ici ce qu'il faut trouver avant ce qui suit pour que la reconnaissance ait lieu.

    Le point essentiel est ces assertions arrière de longueur nulle précisent qu'il faut trouver ou ne pas trouver avant ce qui suit, mais sont de longueur nulle, ce qui veut dire qu'elle ne consomment pas l'argument qu'elles reconnaissent.

    Je dois dire que je connaissais l'existence de ces assertions de longueur nulle (il y en a quatre, avant, arrière, positive ou négative) et que j'en avais testé une pour comprendre à peu près ce qu'elles faisaient, mais c'est bien la première fois que je me trouve face à un cas pratique où ça sert vraiment. Et je n'y ai pas pensé du premier coup en lisant ton message, ce n'est qu'en y repensant quelques heures plus tard que je me suis dit que cette construction dont je ne me souvenais qu'assez vaguement pouvait sans doute servir.

  8. #8
    Candidat au Club
    Inscrit en
    Juillet 2007
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 9
    Points : 3
    Points
    3
    Par défaut
    c'est bien la première fois que je me trouve face à un cas pratique où ça sert vraiment
    Je suis ravi d'avoir pu t'apporter ça alors ! Ne me remercie pas, ça me fait plaisir

    Plus serieusement, c'est résolu, merci pour la solution, et surtout pour l'explication.

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

Discussions similaires

  1. Réponses: 9
    Dernier message: 06/06/2007, 23h03
  2. Réponses: 6
    Dernier message: 20/02/2007, 10h54
  3. Réponses: 1
    Dernier message: 09/01/2007, 15h33
  4. Retour à la ligne qui compte pour 2 caractères!
    Par Pragmateek dans le forum C++
    Réponses: 5
    Dernier message: 04/04/2006, 16h59
  5. Réponses: 13
    Dernier message: 03/12/2005, 17h09

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