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

JavaScript Discussion :

Recherche de plusieurs mots via une regex [RegExp]


Sujet :

JavaScript

  1. #1
    Membre averti
    Avatar de UNi[FR]
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Juin 2002
    Messages
    340
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : Juin 2002
    Messages : 340
    Points : 448
    Points
    448
    Par défaut Recherche de plusieurs mots via une regex
    Bonjour à tous,

    J'ai une erreur sur mon expression réguliére si quelqu'un peu m'aide

    voila le texte :
    word1 word 2 word3
    si mon expression réguliére cherche les mots dans le bonne ordre ca fonctionne :
    (?:.*word1)(?:.*word3)
    par contre si les mots cherché ne sont pas dans le bonne ordre ca ne fonctionne pas :
    (?:.*word3)(?:.*word1)
    Y-a-t-il une solution ?

    Merci d'avance pour votre aide.

    Nico.
    Gnarf !
    Mon C.V.
    Culture agile && Software Craftsmanship && (.NET {VS 2019 && WPF} || PHP {(PHPStorm || VS Code) && (Docker)})

    Pensez au TAG

  2. #2
    Membre actif
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    162
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 162
    Points : 209
    Points
    209
    Par défaut
    Salut UNI[FR],

    La construction de ton expression régulière implique un ordre dans la recherche de tes "mots", il te faut utiliser un "OU", par exemple :

    ou encore :

    Et si tu veux restreindre le mot "complet" (éviter par exemple sword1) :

    A+

  3. #3
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 858
    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 858
    Points : 6 556
    Points
    6 556
    Par défaut
    Tu ne peux pas obtenir avec une expression régulière des résultats qui se recouvrent. Avec l'expression (?:.*word3)(?:.*word1) la première parenthèse va trouver word1 word2 word3, word1 word2 étant représenté par .*. Il ne reste plus de caractères pour la deuxième parenthèse, ceux-ci ayant été entièrement "consommés" par la première.

    Si tu veux tester la présence des trois mots dans une chaîne avec une regex, il faut ruser en utilisant les tests avant (lookahead) qui eux ne consomment pas de caractères:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (?=.*word3)(?=.*word2)(?=.*word1)
    (J'ai inversé l'ordre des mots pour montrer que ce dernier n'a aucune importance.)

    Comme aucun de ces lookaheads ne consomment de caractères leur point de départ est toujours le début de la chaîne. À noter qu'une telle expression réussira et assurera la présence des 3 mots, mais ne matchera aucun caractère. Autre chose, rien ne garantis qu'un des mots n'est pas compris dans un autre. Pour en être sûr, il faut utiliser des word-boundaries (limites entre un caractère de la classe \w et un autre caractère ou une ancre):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (?=.*\bword3\b)(?=.*\bword2\b)(?=.*\bword1\b)
    Enfin, si tu souhaites que ton expression vérifie la présence des trois mots et de rien d'autre, tu dois utiliser des ancres:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ^\b(?=.*\bword3)(?=.*\bword2)(?=.*\bword1)(?: ?(?:word1|word2|word3)){3}$
    (pas besoin dans ce cas de vérifier la présence de tous les word-boundaries qui sont garantis par l'ancre de fin et le fait que tous les mots qui composent l'expression en ont un au début.)

    On peut même se permettre d'être plus évasif en écrivant simplement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ^\b(?=.*\bword3)(?=.*\bword2)(?=.*\bword1)(?: ?\w+){3}$
    Puisque "l'identité" des trois mots est déjà assurée par les lookaheads.
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  4. #4
    Membre averti
    Avatar de UNi[FR]
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Juin 2002
    Messages
    340
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : Juin 2002
    Messages : 340
    Points : 448
    Points
    448
    Par défaut
    Merci à tous pour vos retours, en effet il fallait que j'utilise le = à a place du :

    Ce qui me donne

    (?=.*word1)(?=.*word3)
    Gnarf !
    Mon C.V.
    Culture agile && Software Craftsmanship && (.NET {VS 2019 && WPF} || PHP {(PHPStorm || VS Code) && (Docker)})

    Pensez au TAG

  5. #5
    Membre confirmé
    Avatar de Darkaurora
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2010
    Messages
    382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2010
    Messages : 382
    Points : 549
    Points
    549
    Billets dans le blog
    1
    Par défaut
    Pour information j'ai découvert une appli web très bien faite qui m'a permis de mieux appréhender les expressions régulières:

    http://regex101.com/

    Je ne sais pas si le lien a déjà été proposé mais ça ne coûte rien , j'ai enfin découvert le plaisir de créer soit même ses expressions régulières, notion qui a longtemps été obscure pour moi même si je connait la puissance de l'outil.

    A utiliser sans modération avec l’excellent cours: http://javascript.developpez.com/tut...-rationnelles/
    Je préfère fermer ma gueule et passer pour un con que de l'ouvrir et ne laisser aucun doute à ce sujet.

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

Discussions similaires

  1. [XL-2007] Recherche de plusieurs mots dans une colonne
    Par merlinus3000 dans le forum Excel
    Réponses: 2
    Dernier message: 30/09/2013, 12h38
  2. Recherche de plusieurs mots dans une chaine
    Par Thib6670 dans le forum C#
    Réponses: 3
    Dernier message: 30/06/2011, 15h19
  3. faire une recherche avec plusieurs mot-clés
    Par jakouz dans le forum Débuter
    Réponses: 2
    Dernier message: 16/12/2010, 13h50
  4. rechercher plusieurs mot dans une phrase
    Par andromeda dans le forum C#
    Réponses: 5
    Dernier message: 14/10/2010, 01h34
  5. Réponses: 0
    Dernier message: 24/11/2007, 02h09

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