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 :

Trouver le bon pattern pour supprimer des mots non suivis d'autres mot ! [RegEx]


Sujet :

Langage PHP

  1. #1
    Membre habitué
    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    108
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 108
    Points : 181
    Points
    181
    Par défaut Trouver le bon pattern pour supprimer des mots non suivis d'autres mot !
    Bonjour,

    J'utilise les REGEXP Perl et je suis confronté au probleme suivant :
    J'ai une chaine de caractère :var1 var1. W var2 $var2. var3 var5 var5. var6
    Je souhaite reperer les mots qui ne sont pas suivi par un mot qui termine par un .
    Donc je souhaite repérer ici w var3 var6 afin de les remplacer par du vide et donc les supprimer de ma chaine de caractère.
    Et donc avoir ma chaine traitée suivante : var1 var1. var2 $var2. var5 var5.

    Je bloque car les regexp me permettent pas de dire ce que veux garder mais uniquement ce que je veux supprimer.

    Cordialement,

    Suistrop

  2. #2
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 912
    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 : 2 912
    Points : 6 705
    Points
    6 705
    Par défaut
    les regexp me permettent pas de dire ce que veux garder mais uniquement ce que je veux supprimer
    C'est le début de la sagesse!

    Pourquoi ne pas utiliser un test avant négatif ( negative lookahead: non suivi de): (?!.....).

    Pense aussi au quantificateur possessif ++ qui interdit au moteur de récupérer des caractères pour tester d'autres solutions.

    Avec ça tu devrais t'en sortir.

  3. #3
    Membre habitué
    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    108
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 108
    Points : 181
    Points
    181
    Par défaut
    Salut CosmoKnacki,

    Merci pour ta réponse c'est exactement ca ! Malheureusement, j'utilisais ( negative lookahead: non suivi de): (?!.....) mais la doc que j'ai lu m'a embrouillé sur son utilisation (je pensais que le pattern de ?! devait se trouver dans le pattern avant :/) !!

    Si ça intéresse du monde le pattern est : (\w*[^\.]) (?!\$?\w*\.)!!!

    Merci !!!


    Cordialement,

    Suistrop

  4. #4
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 912
    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 : 2 912
    Points : 6 705
    Points
    6 705
    Par défaut
    Pas mal, par contre ta pattern ne prend pas var6 s'il est en fin de chaîne (non suivi d'un espace), mais tu peux ajuster ta pattern en ajoutant une alternative:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    \w*[^.](?: |$)(?!\$?\w*\.)
    (pas besoin d'échapper les caractères spéciaux dans une classe de caractères et le groupe de capture n'est pas utile.)

    Moi je pensais plutôt à:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [^\s.]++(?!(?>\s+[^\s.]+)?\.)\s*
    (Le terme "mot" est défini comme une suite de caractères qui ne sont ni des caractères blancs, ni un point.) Voir la doc sur les quantificateurs possessifs et les groupes atomiques (possessive quantifiers, atomic groups).

    ou une autre méthode plus efficace:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [^\s.]++(?:(?>\s+[^\s.]+)?\.\s*(*SKIP)(*FAIL))?\s*
    qui force la pattern à échouer (avec la directive (*FAIL)) quand un mot est suivi d'un autre mot avec un point et qui interdit au moteur de tester à nouveau toutes les positions de la sous-chaîne en question (avec la directive (*SKIP)). Voir la doc sur les "verbes de contrôle du backtracking" (backtracking control verbs).

    À noter pour que les trois patterns vont laisser un espace en fin de chaîne si un mot en fin de chaîne est remplacé, il faut donc faire un trim à droite. Autre chose, les "mots" tels qu'ils sont définis ne doivent pas contenir de point.

  5. #5
    Membre habitué
    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    108
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 108
    Points : 181
    Points
    181
    Par défaut
    Salut CosmoKnacki,

    Merci de ton feedback. Je ne peux pas utiliser les ?> dans avec le langage (SAS) que j'ai.
    En utilisant ton premier pattern : \w*[^.](?: |$)(?!\$?\w*\.), il fait pas ce que je lui demande :/ à cause de mot commencant par $.

    Mon pattern a un peu évolué : (\S*[^\.]) (?!\$?\S*\.)

    Je n'ai plus qu'un seul soucis c'est que je n'arrive pas à détecter lorsque dans ma chaine de caractere il y a plusieurs espace entre les mots. J'utilise donc une fonction qui ne laisse que 1 espace au plus entre chaque mot.

    Cordialement,

  6. #6
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 912
    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 : 2 912
    Points : 6 705
    Points
    6 705
    Par défaut
    Dans ce cas la, une autre approche conviendrait mieux. Elle consiste à chercher d'abord les mots suivis d'un point avec éventuellement le mot précédent, puis ceux qui ne le sont pas. Dans le premier cas on capture tout dans un groupe dans l'autre non.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    machaine = prxchange('s/([^\s.]+(?:\s+[^\s.]+)?\.\s*)|\S+\s*/$1 /', -1, machaine);
    machaine = trim(machaine);

  7. #7
    Membre habitué
    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    108
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 108
    Points : 181
    Points
    181
    Par défaut
    Et bien la ca fonctionnne nickel !

    Merci.

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

Discussions similaires

  1. Les design pattern pour créer des jeux
    Par alex6891 dans le forum Design Patterns
    Réponses: 4
    Dernier message: 26/11/2018, 20h59
  2. Réponses: 4
    Dernier message: 05/12/2012, 21h46
  3. Réponses: 45
    Dernier message: 04/05/2006, 02h10
  4. Utiliser awk pour supprimer des retours charrios
    Par tomsoyer dans le forum Linux
    Réponses: 3
    Dernier message: 03/01/2005, 19h27
  5. Shell pour supprimer des lignes d'un fichier
    Par nelsa dans le forum Autres langages
    Réponses: 2
    Dernier message: 20/09/2004, 13h26

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