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

[PCRE] Trouver les lignes ne contenant pas un mot


Sujet :

Langage PHP

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 13
    Points : 14
    Points
    14
    Par défaut [PCRE] Trouver les lignes ne contenant pas un mot
    Je voudrais trouver les lignes qui contiennent un mot, mais pas l'autre.

    Exemple : je veux trouver les lignes contenant "age:\d+" mais pas "deleted".

    [deleted]name:John;age:44;city:metropolis
    ne doit pas être acceptée, alors que
    [new]name:John;age:44;city:metropolis
    doit l'être.

    Avec les negative look behind ça ne fonctionne pas, puisque mon mot interdit ne précède pas forcément immédiatement le mot recherché.

    J'ai naïvement tenté ça mais ça ne marche pas (tout est accepté) :
    (?<!deleted).+age:\d+

    Une idée ? Merci

  2. #2
    Membre éprouvé Avatar de vorace
    Homme Profil pro
    Développeur
    Inscrit en
    Août 2010
    Messages
    573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Août 2010
    Messages : 573
    Points : 915
    Points
    915
    Par défaut
    essaies avec strpos...
    Développeur informatique contrarié...

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 13
    Points : 14
    Points
    14
    Par défaut
    Bonjour,

    Merci vorace pour la réponse mais il ne s'agit pas de langage de programmation, il s'agit purement de regex pour le coup. En l'occurrence, je m'en sers dans un éditeur de fichier.

  4. #4
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    notepad++ ?

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 13
    Points : 14
    Points
    14
    Par défaut
    Euh par exemple Mais pour les recherches complexes dans de gros répertoires, j'ai pris l'habitude d'utiliser plutôt PowerGREP, voire Funduc Search and Replace.

    Ceci-dit, la v6 de NP++ m'a réconcilié avec sa fonction de recherche regex.

  6. #6
    Membre du Club Avatar de Halex78
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2007
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mars 2007
    Messages : 75
    Points : 68
    Points
    68
    Par défaut
    Hello,
    avec des automates produits ca doit être possible de construire une telle regex, mais les gens ont peuuuur des automates apparemment.
    Si tu construis l'automate qui reconnait le langage des mots qui contiennent age, et un autre automate qui reconnait le langage des mots qui contiennent delete, alors tu construis l'automate qui reconnait le complémentaire du second langage (les mots qui ne contiennent pas delete), tu fais le produit de ces deux automates, qui reconnait l'intersection des deux langages.
    Une fois cette tache herculéenne accomplie (aucune ironie) tu en déduis la regex à partir de l'automate.
    Donc voilà, si tu la veux vraiment ta regex, il va falloir y aller avec motivation
    Sinon tu pourras toujours utiliser l'option eval, pour appliquer une fonction qui renvoit la ligne si elle contient age, et pas delete, et vide sinon... Mais du coup, ce n'est pas la regex miracle.

    Euh, j'ai bien compris que tu cherchais une "fonction regex" du type not(motif) qui permettrait de matcher des expressions dans lesquelles "motif" n'apparaitrait pas. Ayant moi même cherché cette fonction miraculeuse, j'ai opté pour des solutions alternatives puisqu'elle n'existe apparemment pas...

  7. #7
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Salut,
    Citation Envoyé par Halex78 Voir le message
    Euh, j'ai bien compris que tu cherchais une "fonction regex" du type not(motif) qui permettrait de matcher des expressions dans lesquelles "motif" n'apparaitrait pas. Ayant moi même cherché cette fonction miraculeuse, j'ai opté pour des solutions alternatives puisqu'elle n'existe apparemment pas...
    Si j'étais toi je ne parierais pas ma chemise dessus:
    Voici le pattern qui te permet de faire ce que tu cherches depuis des lustres :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $a = '[deleted]name:John;age:44;city:metropolis';
    $b = '[new]name:John;age:44;city:metropolis';
     
    // ne contient pas le mot deleted :
    $test_a = preg_match('/^((?!deleted).)*$/', $a); // false
    $test_b = preg_match('/^((?!deleted).)*$/', $b); // true

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 13
    Points : 14
    Points
    14
    Par défaut
    Scrogneugneu, rawsrc, le Graal.

    Appliqué à mon problème :
    ^((?!deleted).)*age:\d+.*$

    Un grand merci

  9. #9
    Membre du Club Avatar de Halex78
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2007
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mars 2007
    Messages : 75
    Points : 68
    Points
    68
    Par défaut
    Eh bien je suis heureux d'avoir eu tord Merci beaucoup rawsrc.
    Du coup ça a fait d'une pierre deux coups.

    C'est dingue, je ne l'avais jamais vue nulle part cette $@%µ de fonction... Et pourtant ce n'est pas faute d'avoir cherché.
    Merci encore, c'est une belle épine que vous venez de m'enlever du pied.

Discussions similaires

  1. [RegEx] Trouver les lignes ne contenant pas une expression
    Par venturi dans le forum Langage
    Réponses: 6
    Dernier message: 14/08/2013, 17h52
  2. Réponses: 2
    Dernier message: 27/04/2012, 17h44
  3. Réponses: 2
    Dernier message: 20/05/2011, 13h46
  4. [RegEx] Rechercher les chaines ne contenant pas un mot donné
    Par saramery dans le forum Langage
    Réponses: 23
    Dernier message: 27/11/2008, 12h50
  5. Comment comparer 2 tables et trouver les lignes différentes
    Par PierreYvesQc dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 07/08/2007, 21h04

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