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 :

REGEXP : je bloque sur un pattern


Sujet :

Langage Perl

  1. #1
    Membre éprouvé

    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Janvier 2006
    Messages
    621
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Chef de projet MOA

    Informations forums :
    Inscription : Janvier 2006
    Messages : 621
    Points : 1 264
    Points
    1 264
    Par défaut REGEXP : je bloque sur un pattern
    Bonjour a tous,
    j'ai un besoin simple : tester si une chaine ne contient NI ".log", NI ".xls" et NI ".txt"

    Je ne trouve nulle part d'opérateur ET et NON logique qui me semblent indispensable pour faire ca.
    J'arrive a avoir le test "se termine par .log" : [\.]log$

    donc il me faudrait un truc du genre :

    NON ( ([\.]log$) OU ([\.]xls$) OU ([\.]txt$)) ou alors
    NON([\.]log$) ET NON([\.]xls$) ET NON([\.]txt$))

    Quelqu'un sait il comment faire ca ?

    Merci d'avance.
    "L'incohérence de ceux qui dirigent et l'incompétence de ceux qui critiquent sont un vibrant hommage à ceux qui exécutent."
    Général George S. PATTON. Messine 1943.

  2. #2
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 499 184
    Points
    499 184
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if ( $chaine !~ m{\.(:?log|xls|txt)$}i ) {
       # ...
    }

  3. #3
    Membre éprouvé

    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Janvier 2006
    Messages
    621
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Chef de projet MOA

    Informations forums :
    Inscription : Janvier 2006
    Messages : 621
    Points : 1 264
    Points
    1 264
    Par défaut
    Citation Envoyé par djibril Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if ( $chaine !~ m{\.(:?log|xls|txt)$}i ) {
       # ...
    }
    Merci pour la réponse.

    j'ai oublie quelques précisions : j'ai poste ca dans PERL car le soft qui va utiliser la regexp est en PERL et je sais qu'il y a parfois des differences au niveau des parsers. Du coup ca veut dire que je voudrais seulement la regexp. Dans ton code, je pense que le !~ doit vouloir dire "different de" et c'est justement ca que j'arrive pas a faire.

    Par contre j'ai essaye la regexp et j'ai un doute sur son exactitude : en la testant avec www.annuaire-info.com ca me remonte toujours faux même si je mets comme test toto.log (très connu un info ). Par contre si je retire les {} ca marche.

    et je trouve nulle part dans les spec la signification du :
    "L'incohérence de ceux qui dirigent et l'incompétence de ceux qui critiquent sont un vibrant hommage à ceux qui exécutent."
    Général George S. PATTON. Messine 1943.

  4. #4
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 499 184
    Points
    499 184
    Par défaut
    Le pattern, c'est ça : Maintenant sans plus de code de ta part, difficile de t'aider.

  5. #5
    Membre éprouvé

    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Janvier 2006
    Messages
    621
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Chef de projet MOA

    Informations forums :
    Inscription : Janvier 2006
    Messages : 621
    Points : 1 264
    Points
    1 264
    Par défaut
    ouais c'est bien ca j'avais bien récupère le pattern. Ce pattern me donne les fichiers qui finissent soit par log, soit par txt soit par xls. Maintenant il me faut la négation de ca... Et c'est la que je bloque. Sachant que je peux pas le faire dans le soft qui l'utilise, faudrait que ça soit uniquement dans la regext. Mais comme y a pas d'opérateur de négation ni de ET logique, ca me parait pas possible.
    "L'incohérence de ceux qui dirigent et l'incompétence de ceux qui critiquent sont un vibrant hommage à ceux qui exécutent."
    Général George S. PATTON. Messine 1943.

  6. #6
    Membre confirmé
    Avatar de Schmorgluck
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    371
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Mai 2006
    Messages : 371
    Points : 558
    Points
    558
    Par défaut
    Citation Envoyé par arkhamon Voir le message
    et je trouve nulle part dans les spec la signification du :
    Aucune signification particulière, en l'occurrence. Il s'agit juste d'un caractère qui peut être là ou pas, grâce au point d'interrogation.

    MAIS, en fait, je crois que Djibril a juste fait une faute de frappe en ouvrant des parenthèses non capturantes.

    Du coup, le pattern serait plutôt ça :Pour ce qui est de ton problème, j'ai de bonnes nouvelles. Du fait que tu cherches spécifiquement à la fin, et du fait que tous les patterns que tu testes ont la même taille, il y a une bidouille possible avec un test arrière négatif :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (?<!\.(?:log|xls|txt))$
    There's nothing like $HOME!

  7. #7
    Membre éprouvé

    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Janvier 2006
    Messages
    621
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Chef de projet MOA

    Informations forums :
    Inscription : Janvier 2006
    Messages : 621
    Points : 1 264
    Points
    1 264
    Par défaut
    Salut et merci !

    visiblement cette expression a l'air de fonctionner, mais je n'arrive pas a comprendre comment

    Pourrais tui me l'expliquer en détail, surtout cette partie la :
    ?<!\.(?: et en particulier le signe < que je trouve dans aucune reference

    en fait si tu pouvais tout exppliquer pas a pas car je seche un peu
    "L'incohérence de ceux qui dirigent et l'incompétence de ceux qui critiquent sont un vibrant hommage à ceux qui exécutent."
    Général George S. PATTON. Messine 1943.

  8. #8
    Membre confirmé
    Avatar de Schmorgluck
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    371
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Mai 2006
    Messages : 371
    Points : 558
    Points
    558
    Par défaut
    La syntaxe (?<!motif) est un test arrière négatif à étendue nulle (dans la perldoc perlre "zero-width negative look-behind assertion"). Cette expression vérifie que le texte qui précède immédiatement le point où en est l'examen de la chaîne n'est pas reconnu par le motif qu'elle contient. À l'instar des ancres de début de chaîne, de fin de chaîne, de limite de mot, etc, elle ne capte aucun caractère, elle vérifie une condition à un endroit de la chaîne.

    Comme ici elle est immédiatement suivie du caractère de fin de chaîne, le motif total ne peut être vérifié que si le motif contenu dans le test arrière négatif n'est pas vérifié juste à la fin de la chaîne. Détail amusant, puisque ces deux expressions, la fin de chaîne et le test arrière, sont de taille nulle, on peut très bien les intervertir, ça ne change rien au résultat. À la limite, mettre le caractère de fin de chaîne en premier pourrait en théorie optimiser l'exploitation du motif, mais en pratique je soupçonne perl de faire spontanément cette optimisation.
    There's nothing like $HOME!

  9. #9
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    Schmorgluck, une fois la regexp corrigée dans la ligne de Djibril, cette dernière devrait retourner le même résultat que ta proposition.
    Ainsi, ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if ( $chaine !~ m{\.(?:log|xls|txt)$}i ) {
       # ...
    }
    devrait être équivalent à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if ( $chaine  =~ (?<!\.(?:log|xls|txt))$}i) {
       # ...
    }
    Non ?
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  10. #10
    Membre confirmé
    Avatar de Schmorgluck
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    371
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Mai 2006
    Messages : 371
    Points : 558
    Points
    558
    Par défaut
    Dans le cadre d'un script perl, oui, mais ça n'est pas la question.
    There's nothing like $HOME!

  11. #11
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    Désolé alors, je n'ai pas compris : quelle est la question ?
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  12. #12
    Mr6
    Mr6 est déconnecté
    Membre éclairé

    Homme Profil pro
    Inscrit en
    Septembre 2004
    Messages
    607
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2004
    Messages : 607
    Points : 794
    Points
    794
    Par défaut
    C'était une question de regex pure, sans perl autour
    j'ai oublie quelques précisions : j'ai poste ca dans PERL car le soft qui va utiliser la regexp est en PERL et je sais qu'il y a parfois des differences au niveau des parsers. Du coup ca veut dire que je voudrais seulement la regexp. Dans ton code, je pense que le !~ doit vouloir dire "different de" et c'est justement ca que j'arrive pas a faire.

  13. #13
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    Bien vu...
    Dans ce cas, je doute que l'assertion proposée par Schmorgluck soit implémentée dans tous les langages, car il me semble que ces assertions sont des extensions perl.

    La regexp de djibril, une corrigée, et utilisée de manière négative dans le test (!regexp(text, motif)) devrait répondre à la question du motif dans la majorité des cas.
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

Discussions similaires

  1. [RegEx] Je bloque sur une regexp
    Par Styls dans le forum Langage
    Réponses: 2
    Dernier message: 04/07/2011, 22h07
  2. Réponses: 9
    Dernier message: 29/03/2006, 18h23
  3. [Design]Question sur le pattern Controleur.
    Par sebastieng dans le forum AWT/Swing
    Réponses: 5
    Dernier message: 06/03/2006, 18h36
  4. [ACCESS] Je bloque sur une requête...
    Par portu dans le forum Langage SQL
    Réponses: 8
    Dernier message: 16/02/2006, 10h33
  5. Réponses: 2
    Dernier message: 15/11/2005, 10h09

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