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 :

Cr�ation d'un regex avanc� [RegExp]


Sujet :

JavaScript

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  1. #1
    Membre chevronn�
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    1 855
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 1 855
    Par d�faut Cr�ation d'un regex avanc�
    Bonjour,

    Actuellement, j'ai une liste de r�f�rence produit.
    Chaque r�f�rence produit est constitu�e des caract�res suivants : lettre en majuscule, chiffres, certains caract�res sp�ciaux (".", "/", "-", "*", "_", "(", ")").
    Les r�f�rences produit ne contiennent pas d'espace.

    J'ai cr�� un syst�me de recherche qui affiche la liste de produits associ�s en fonction de la valeur d'un champs de recherche renseign�e par l'utilisateur.
    Bien que les r�f�rences soient renseign�es dans la BDD qu'avec des lettre en majuscule, si l'utilisateur entre des minuscules, la recherche fonctionne quand m�me.
    Bien que les r�f�rences soient renseign�es dans la BDD sans contenir d'espaces, si l'utilisateur entre des espaces, ceux-ci sont ignor�s dans la recherche.
    Le caract�re "�" est remplac� dans la recherche par le caract�re "U".

    Par exemple, si on a cette BDD :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    AAA-123US
    AAA-124US
    BBB-124US
    BBB-124AS
    Si l'utilisateur entre dans le champs de recherche "124 �S", �a affiche :
    Voici que le code qui g�n�re le regex :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    function getProductRegex(reference){
    	//console.log(reference);
    	let newReference = reference.replace('µ', 'U') // remplacement µ par U
    								.toUpperCase() // conversion en majuscule
    				                .split(' ').join(''); // suppression des espaces
    	//console.log(newReference);
     
    	let re = $.ui.autocomplete.escapeRegex(newReference);
     
    	let matcher;
    	matcher = new RegExp(re);	
     
    	return matcher;
    }
    La BDD (Base De Donn�es) est stock�e sous forme de variable dans mon script javascript :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    var bdd = ["AAA-123US", "AAA-124US", "BBB-124US", "BBB-124AS"];

    Maintenant, j'aimerai am�liorer le syst�me pour que la recherche fonctionne par mots clefs s�par�s par des espace.
    Par exemple si l'utilisateur entre dans le champs de recherche "�S 124 BBB", que �a affiche :
    ... que le regex recherche toutes les chaines de caract�res qui contiennent TOUS les mots clef entr�s (peu importe l'ordre).

    Comment faire cela ?

    Merci d'avance

  2. #2
    R�dacteur/Mod�rateur

    Avatar de SpaceFrog
    Homme Profil pro
    D�veloppeur Web Php Mysql Html Javascript CSS Apache - Int�grateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 659
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 75
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activit� : D�veloppeur Web Php Mysql Html Javascript CSS Apache - Int�grateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 659
    Billets dans le blog
    1
    Par d�faut
    Tu parles de BDD
    Les donn�es sont dans un table MySQL ?

    Il serait peut �tre plus int�ressant de faire la recherche en utilisant le fulltext ?
    https://www.w3resource.com/mysql/mys...-functions.php
    Ma page Developpez - Mon Blog Developpez
    Pr�sident du CCMPTP (Comit� Contre le Mot "Probl�me" dans les Titres de Posts)
    Deux r�gles du succ�s: 1) Ne communiquez jamais � quelqu'un tout votre savoir...
    Votre post est r�solu ? Alors n'oubliez pas le Tag

    Venez sur le Chat de D�veloppez !

  3. #3
    Membre chevronn�
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    1 855
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 1 855
    Par d�faut
    Non les donn�es sont enregistr�es dans une variable locale :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    var bdd = ["AAA-123US", "AAA-124US", "BBB-124US", "BBB-124AS"];
    ... je vais rajouter cette infos dans mon premier message.

  4. #4
    R�dacteur/Mod�rateur

    Avatar de SpaceFrog
    Homme Profil pro
    D�veloppeur Web Php Mysql Html Javascript CSS Apache - Int�grateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 659
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 75
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activit� : D�veloppeur Web Php Mysql Html Javascript CSS Apache - Int�grateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 659
    Billets dans le blog
    1
    Par d�faut
    Ha ok

    Donc si on rentre des suites de caract�res s�par�s par des espaces il faudra rechercher selon les "mots" ainsi rentr�s ?

    Faut il que tous les mots soient pr�sent ou la recherche est elle "ou" ?

    Il suffira de r�cup�rer la chaine de recherche, la splitter et constituer une nouvelle regex avec des pipes ...
    Ma page Developpez - Mon Blog Developpez
    Pr�sident du CCMPTP (Comit� Contre le Mot "Probl�me" dans les Titres de Posts)
    Deux r�gles du succ�s: 1) Ne communiquez jamais � quelqu'un tout votre savoir...
    Votre post est r�solu ? Alors n'oubliez pas le Tag

    Venez sur le Chat de D�veloppez !

  5. #5
    Membre chevronn�
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    1 855
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 1 855
    Par d�faut
    Malheureusement, c'est un "et" que je veux faire. Je pourrais faire autant de passe regex qu'il y a de mots clefs mais on ne peut pas g�rer �a directement via un regex ?
    ... et puis faire plusieurs passes, �a ne marche bien pour la gestion des recouvrements (ex: recherche de "AB BC" va matcher la chaine "ABC" alors que �a ne devrait pas).

  6. #6
    R�dacteur/Mod�rateur

    Avatar de SpaceFrog
    Homme Profil pro
    D�veloppeur Web Php Mysql Html Javascript CSS Apache - Int�grateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 659
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 75
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activit� : D�veloppeur Web Php Mysql Html Javascript CSS Apache - Int�grateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 659
    Billets dans le blog
    1
    Par d�faut
    un et OK mais dans l'ordre ?

    du coup tu pourrais faire une reg par mot et ainsi faire un score de match
    ceux qui matche tous les mots ... =100%
    ceux qui matche tous les mots -1 = nbr mots-1 / nbre mots *100 %
    etc ...
    Ma page Developpez - Mon Blog Developpez
    Pr�sident du CCMPTP (Comit� Contre le Mot "Probl�me" dans les Titres de Posts)
    Deux r�gles du succ�s: 1) Ne communiquez jamais � quelqu'un tout votre savoir...
    Votre post est r�solu ? Alors n'oubliez pas le Tag

    Venez sur le Chat de D�veloppez !

  7. #7
    Expert confirm�
    Avatar de javatwister
    Homme Profil pro
    danseur
    Inscrit en
    Ao�t 2003
    Messages
    3 684
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activit� : danseur

    Informations forums :
    Inscription : Ao�t 2003
    Messages : 3 684
    Par d�faut
    En amont, en amont... Oui mais imagine rien qu'un millier de r�f�rences � entrer!
    Et puis n'oublions pas que la saisie peut �tre elliptique par rapport aux r�f�rences. On peut saisir "a" et esp�rer un r�sultat comprenant "AAA".

  8. #8
    Expert confirm� Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 986
    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 986
    Par d�faut
    Citation Envoy� par javatwister Voir le message
    En amont, en amont... Oui mais imagine rien qu'un millier de r�f�rences � entrer!
    Et puis n'oublions pas que la saisie peut �tre elliptique par rapport aux r�f�rences. On peut saisir "a" et esp�rer un r�sultat comprenant "AAA".
    Un millier, c'est une broutille!

    La g�n�ration de l'objet map ne prend que quelques dixi�mes de seconde (et encore) et est faite une fois pour toutes: sous nodejs, j'atteint la seconde (g�n�ration al�atoire du tableau de r�f�rences et test avec une entr�e utilisateur compris) qu'� partir de 300 000 r�f�rences!

    Quant au temps de recherche lui-m�me, il est totalement n�gligeable, m�me avec des entr�es elliptiques.

    Il faut bien voir que le nombre de clefs de la map est major�e et ne d�passera pas 19252 entr�es quelque soit le nombre de r�f�rences (19252 = 26^3 + 10^3 + 26^2) et quelles sont associ�es � des Sets de nombres. Donc l'occupation en m�moire ne coutera � quelque chose pr�s pas plus ch�re que le tableau d'origine. Pour illustrer, pass� 10.000 r�f�rences, le nombre d'entr�es de la map devient inf�rieur � celui du tableau.

    Par contre, le probl�me de chevauchement des �l�ments de l'entr�e utilisateur reste entier, mais sera plus rapide � r�gler une fois ce premier filtrage effectu� (par exemple pour 1 million de r�f�rences, j'obtiens ~150 r�sultats contenant AI et IA).

  9. #9
    Expert confirm�
    Avatar de javatwister
    Homme Profil pro
    danseur
    Inscrit en
    Ao�t 2003
    Messages
    3 684
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activit� : danseur

    Informations forums :
    Inscription : Ao�t 2003
    Messages : 3 684
    Par d�faut
    Tu peux tester le bout de code ds une page et voir si �a marche?

  10. #10
    Membre chevronn�
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    1 855
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 1 855
    Par d�faut
    A priori avec cette m�thode �a fonctionne (test� avec le moteur de recherche en mode Regex du logiciel Notepad++) : https://stackoverflow.com/questions/...s-in-any-order
    ... par contre, je n'ai pas bien comprise comment fonctionne ce regex.

    Par exemple :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    ^(?=.*US)(?=.*124)(?=.*BBB).*$
    Match bien :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    BBB-124US
    BBBUS-124
    BBBUSUS-124
    Et ne match pas :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    AAA-124US
    AAA-123US
    AAA-123US
    BBB-124AS

  11. #11
    Expert confirm�
    Avatar de javatwister
    Homme Profil pro
    danseur
    Inscrit en
    Ao�t 2003
    Messages
    3 684
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activit� : danseur

    Informations forums :
    Inscription : Ao�t 2003
    Messages : 3 684
    Par d�faut
    Je ne comprends toujours pas ce que tu fais...

    Je me r�p�te mais tu n'as pas besoin de regexp: l'utilisateur tape 2 ou 3 "mots" cl�s et tu affiches les donn�es qui contiennent ces mots cl�s...
    Donc, � peu pr�s rien � coder;

  12. #12
    Expert confirm� Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 986
    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 986
    Par d�faut
    Citation Envoy� par boboss123 Voir le message
    A priori avec cette m�thode �a fonctionne (test� avec le moteur de recherche en mode Regex du logiciel Notepad++) : https://stackoverflow.com/questions/...s-in-any-order
    ... par contre, je n'ai pas bien comprise comment fonctionne ce regex.

    Par exemple :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    ^(?=.*US)(?=.*124)(?=.*BBB).*$
    C'est simple cette pattern teste en partant du d�but de la cha�ne (^) pour chaque test avant (?=...) (lookahead) si US, 124 et BBB sont bien pr�sent dans la cha�ne. (� noter que .*$ ne sert � rien, on se doute bien que la cha�ne va finir un jour).
    Par contre ce qu'elle ne fait pas c'est de r�soudre le probl�me de chevauchement: ^(?=.*AB)(?=.*BA) trouvera ABC-123BA mais aussi ABA-123US.


    Accessoirement, il serait utile de savoir de quoi on parle: quel est le format pr�cis des r�f�rences? Est-ce qu'il y en a plusieurs qui coexistent? Quelle est la taille de ton tableau de r�f�rences? Pourquoi sont-elles en dur dans ton javascript, d'o� viennent-elles?

  13. #13
    Expert confirm� Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 986
    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 986
    Par d�faut
    En fait je me suis compliqu� la vie pour rien, j'�tais tellement persuad� que le parcours du tableau allait �tre lent que j'ai cherch� une solution de rechange qui en plus r�soudrait le probl�me de chevauchement, mais en fait il est rapide m�me avec beaucoup d'�l�ments et le probl�me de chevauchement n'est pas r�solu dans le cas de saisies �lliptiques avec ma m�thode. Je vais chercher autre chose.

  14. #14
    Membre chevronn�
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    1 855
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 1 855
    Par d�faut
    J'ai beau lire des tutos sur les lookahead, je n'arrive toujours � comprendre ce que �a fait exactement.

    Si j'ai bien compris le regex suivant cherche "A" suivit de "B" ou "C" puis suivit de D ?
    Je ne comprends pas pourquoi il faut que B et C soit pr�sents obligatoirement et l'ordre n'a pas d'importance.

    C'est quoi la diff�rence avec �a ?

    Au final, g�rer les chevauchement n'est peut-�tre pas si important (d'ailleurs, je viens de tester le logiciel Everything dont je me suis servit comme inspiration et il ne g�re pas les chevauchements... je vais faire sans alors).
    ... mais �a peut quand m�me �tre int�ressant de savoir comment le faire

    Entre une solution � base de indexOf o� l'on fait une boucle pour tester chaque mot clef sur la chaine et ce regex, il y a une diff�rence de performance ? (dans mon cas, je n'ai pas �norm�ment de r�f�rences � g�rer mais autant utiliser la meilleure m�thode).

  15. #15
    Expert confirm� Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 986
    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 986
    Par d�faut
    Le lookahead ne consomme pas de caract�res contrairement � une classe de caract�res ou le point qui consomme un caract�re puis avance � la position suivante dans la cha�ne. � la fermeture du lookahead on est toujours au m�me endroit dans la cha�ne qu'� son ouverture.
    Si tu veux une analogie, un lookahead, c'est un marcheur qui s'arr�te pour regarder au loin avec ses jumelles, il sait ce qu'il l'attend sans pour autant s'y �tre rendu. Si ce qu'il voit lui plait, il continue, sinon il abandonne.

  16. #16
    Expert confirm�
    Avatar de javatwister
    Homme Profil pro
    danseur
    Inscrit en
    Ao�t 2003
    Messages
    3 684
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activit� : danseur

    Informations forums :
    Inscription : Ao�t 2003
    Messages : 3 684
    Par d�faut
    Citation Envoy� par boboss123 Voir le message
    Au final, g�rer les chevauchement n'est peut-�tre pas si important (d'ailleurs, je viens de tester le logiciel Everything dont je me suis servit comme inspiration et il ne g�re pas les chevauchements... je vais faire sans alors).
    ... mais �a peut quand m�me �tre int�ressant de savoir comment le faire

    Entre une solution � base de indexOf o� l'on fait une boucle pour tester chaque mot clef sur la chaine et ce regex, il y a une diff�rence de performance ? (dans mon cas, je n'ai pas �norm�ment de r�f�rences � g�rer mais autant utiliser la meilleure m�thode).
    Voil�, on y arrive!

    ==> le probl�me du chevauchement n'en est pas vraiment un: si l'utilisateur est assez intelligent, il ne va pas saisir n'importe quoi �tant donn� ce qu'il veut obtenir;

    ==> indexOf est toujours plus rapide qu'une regexp;

    ==> une regexp n'a d'int�r�t que si le masque peut correspondre � plusieurs cha�nes diff�rentes: ici, ce n'est pas le cas.

  17. #17
    Membre chevronn�
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    1 855
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 1 855
    Par d�faut
    Citation Envoy� par CosmoKnacki Voir le message
    quel est le format pr�cis des r�f�rences?
    Chaque r�f�rence produit est constitu�e des caract�res suivants : lettre en majuscule, chiffres, certains caract�res sp�ciaux (".", "/", "-", "*", "_", "(", ")").
    Les r�f�rences produit ne contiennent pas d'espace.
    Les r�f�rences produit sont compos�e des sous-chaines qui ont une signification... d'o� l�int�r�t de pouvoir faire une recherche par mots clefs.

    Citation Envoy� par CosmoKnacki Voir le message
    Est-ce qu'il y en a plusieurs qui coexistent?
    Non mais on peut avoir "AAA" et "AAAB".

    Citation Envoy� par CosmoKnacki Voir le message
    Quelle est la taille de ton tableau de r�f�rences?
    500 �l�ments au max.

    Citation Envoy� par CosmoKnacki Voir le message
    Pourquoi sont-elles en dur dans ton javascript, d'o� viennent-elles?
    Elle sont en dur pour �viter d'avoir � g�rer un langage cot� serveur (ex: PHP)... et accessoirement de pouvoir aussi l�ex�cuter en mode hors ligne pour faciliter les tests (pas indispensable). C'est site Web basique qui consiste � afficher des informations sur une r�f�rence produit s�lectionn�e avec un moteur de recherche qui int�gre un syst�me d�autocompl�tion (affiche la liste des produits en fonction des mots clefs renseign�s).

+ R�pondre � la discussion
Cette discussion est r�solue.

Discussions similaires

  1. [RegExp] Aide pour la cr�ation d'un regex
    Par beegees dans le forum G�n�ral JavaScript
    R�ponses: 4
    Dernier message: 15/08/2011, 14h11
  2. Erreur 400 : cr�ation de barres d'avancement
    Par polo31 dans le forum Macros et VBA Excel
    R�ponses: 7
    Dernier message: 28/07/2011, 10h21
  3. Cr�ation d'une Regex (TextBox Float)
    Par snakzbenjy dans le forum Silverlight
    R�ponses: 2
    Dernier message: 13/04/2011, 20h07
  4. Cr�ation du site web Avanc�
    Par wkd dans le forum EDI, CMS, Outils, Scripts et API
    R�ponses: 1
    Dernier message: 13/07/2007, 14h30
  5. [RegEx] Probleme de cr�ation d'un regex
    Par mathis49 dans le forum Langage
    R�ponses: 6
    Dernier message: 15/06/2007, 12h08

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