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] Comment exprimer la négation d'un mot ?


Sujet :

Langage Perl

  1. #1
    Membre émérite
    Avatar de mamelouk
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    867
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2005
    Messages : 867
    Par défaut [regexp] Comment exprimer la négation d'un mot ?
    Salut à tous,

    avant tous, je sais que ma question est d'ordre général regexp, mais je pense que le forum perl est le meilleur endroit pour poser cette question (en absence d'un forum spécial regexp)

    Alors, voilà, comment exprime-t-on la négation pour un mot entier en regexp ?
    Je ne veut pas voir apparaitre la suite "avi" dans la phrase que je cherche, et le seul moyen que j'ai trouvé c'est d'exprimer la négation de la suite de chacune des lettres séparément, càd : [^a][^v][^i]

    C'est un peu nul, non ? Qui connait la vrai solution ?

    a+

    edit: une autre question pour les pros du regexp : ([^a][^v][^i])+ ca va faire quoi ?

  2. #2
    Expert confirmé
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Par défaut
    Une solution fort simple : utiliser la regex 'avi', mais prendre la négation de la reconnaissance....
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    if( not m/avi/ ){
      #blabla
    }
    Parfois, dans une regex, on a besoin de s'assurer qu'à un certain endroit de notre reconnaissance, ne se trouve pas une certaine regex, dans ce cas il existe des constructions avancées dite negative look-ahead et look-behind qui permette de vérifier qu'une certaine regex n'est pas matchée à un certain emplacement d'une certaine reconnaissance. Mais je pense que ma première réponse devrait te suffire. Parfois on utilise tellement les regexs qu'on en oublie des évidences comme celle-là...

    Pour ta deuxième question, /([^a][^v][^i])+/ reconnaîtra n'importe quelle chaîne comportant une suite de trois lettres dont la première n'est pas un 'a', la seconde pas un 'v', et la troisième pas un 'i'. Dans $1, on trouvera une suite de ces séquences de trois lettres, commençant au premier emplacement possible pour reconnaître au moins une séquence de trois lettres convenant et la plus longue possible à partir de cet emplacement.

    NB : Ta regex /[^a][^v][^i]/ ne reconnaitrait pas 'aïe', elle ne fait donc pas ce que tu voudrais qu'elle fasse.

    --
    Jedaï

  3. #3
    Membre émérite
    Avatar de mamelouk
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    867
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2005
    Messages : 867
    Par défaut
    :-/

    C'est bien la solution que je cherchais désespérement pour exprimer une négation en regexp lol, mais malgré tout, dans mon cas précis je n'utilise pas de langage de programmation, je l'utilise dans un éditeur de texte!

    Donc, finalement si je comprends bien, il n'existe pas de solution miracle en regexp pour exprimer l'exclusion? (ce que je pourrais accepter comme réponse, car j'imagine qu'à la base ca a été créé pour la reconnaissance et pas l'inverse )

    edit: et aussi, si on veut exprimer par exemple qu'on ne veut pas que "avi" soit juste avant la fin d'une ligne ([^avi]$ dans mon imaginaire), ca deviendrait difficile à exprimer avec le if(! m/avi/), non ?

  4. #4
    Membre émérite
    Avatar de mamelouk
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    867
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2005
    Messages : 867
    Par défaut
    Au fait, merci pour les pistes du look-around, c'est une chose dans les regexp que je ne connaissais pas. Maintenant je m'en vais faire un tour du coté de l'implémentation du regexp dans les langages que j'utilise

  5. #5
    Futur Membre du Club
    Inscrit en
    Juin 2008
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 3
    Par défaut 3 ans plus tard...
    Deux semaines que je cherchais comment faire !
    Donc merci !

Discussions similaires

  1. [RegExp]comment exprimer : Aucun caractère entre 2 parenthèses ?
    Par Laurent Dardenne dans le forum Windows
    Réponses: 5
    Dernier message: 28/03/2008, 18h26
  2. Réponses: 2
    Dernier message: 18/12/2005, 21h10
  3. [batch]comment lancer un excel avec son mot de passe?
    Par victor.ward dans le forum Windows
    Réponses: 1
    Dernier message: 05/12/2005, 10h10
  4. Comment modifier la couleur d'un mot dans un tableau ?
    Par noxious dans le forum Composants VCL
    Réponses: 2
    Dernier message: 16/11/2005, 13h05
  5. Réponses: 3
    Dernier message: 15/11/2005, 23h52

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