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

Contribuez Discussion :

prototype match_all pour expression régulière en javascript


Sujet :

Contribuez

  1. #1
    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 637
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    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 637
    Points : 66 658
    Points
    66 658
    Billets dans le blog
    1
    Par défaut prototype match_all pour expression régulière en javascript
    Voici un petit script qui vient combler une choses que je n'ai pas trouvée en javascript: le match all

    en effet lorsque l'on match test ou exec une chaine en javascript, d'après mes recherches, il s'arrête sur la première occurrence.

    mon prototype retourne un array de toutes les occurences dans la chaine

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
     
    <script type='text/javascript'>
    /**************************************
    *     Script prototype match_all      *
    *        © Spacefrog 2010             *
    * emulation du preg_match_all de php  * 
    **************************************/
     
    RegExp.prototype.match_all=function(mystring){
    var res=[]
    var match;
    if (arguments.length>1){
       		var i=0;
       		while(arguments[++i]!= undefined){
        		res['$'+arguments[i]]=new Array()
        	}
    		while (match = this.exec(mystring)) {
        		var i=0;
        		while(arguments[++i]!=undefined){
        		   match[+arguments[i]] &&	res['$'+arguments[i]].push(match[+arguments[i]]);
        		}
    		}
    }
    else{
    while (match = this.exec(mystring)) {
      res.push(match[0]);
    }
    }
    return res;
    }
     
    //Exemple d'utilisation:
     
    var chaine="produit1 : 321321654321, produit2 :54231fds , produit3 : dfaaa2-22f"
    reg=/(\w+)\s*:\s*([^,]+)/gi;
    results=reg.match_all(chaine,1,2)
    alert(results.$1 +'\n' + results.$2)
    </script>
    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 !

  2. #2
    Expert confirmé
    Avatar de javatwister
    Homme Profil pro
    danseur
    Inscrit en
    Août 2003
    Messages
    3 681
    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 681
    Points : 5 221
    Points
    5 221
    Par défaut
    euh... c'est trop balaise pour moi ça

    pourquoi pas ça?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    var chaine="aaa2-22f---d3___6s___*fs22d2sf22sdf22sd2f2ds2f2"
     
    alert(chaine.match(/[a-z]+/g))

  3. #3
    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 637
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    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 637
    Points : 66 658
    Points
    66 658
    Billets dans le blog
    1
    Par défaut
    en réponse à JT:

    les regExp en javascript souffrent à mon gout de ne pas recupérer toutes les occurrences d'un pattern en une seule fois. et de plus la gestion des niveaux de parenthèses n'est pas top ...

    voici un exemple simpliste qui peut peut être t'eclaircir l'utilité de ce prorotype:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    var chaine="produit1 : 321321654321, produit2 :54231fds , produit3 : dfaaa2-22f"
    reg=/(\w+)\s*:\s*([^,]+)/gi;
    results=reg.matchall(chaine,1,2)
    alert(results.$1 +'\n' + results.$2)
    tu recupères directement deux arrays l'un des produits, l'autres de codes
    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 !

  4. #4
    Expert confirmé
    Avatar de javatwister
    Homme Profil pro
    danseur
    Inscrit en
    Août 2003
    Messages
    3 681
    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 681
    Points : 5 221
    Points
    5 221
    Par défaut
    j'entends bien (voire sujet d'hier et ce matin)!
    mais je reste convaincu qu'un prototype dédié à la séparation de clés / valeurs n'est pas monstrueusement utile: 99 fois sur 100, les données comme celles que tu donnes en exemple sortent d'une base donc sont tableautées au chargement, pour une manipulation rationnelle;

  5. #5
    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 637
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    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 637
    Points : 66 658
    Points
    66 658
    Billets dans le blog
    1
    Par défaut
    Oui JT d'où sans doute cette "lacune" par defaut de besoin réel.

    Mais ayant tâté du preg_match_all en php je tenais à combler ce "manque" coté client.
    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 !

  6. #6
    Rédacteur

    Avatar de danielhagnoul
    Homme Profil pro
    Étudiant perpétuel
    Inscrit en
    Février 2009
    Messages
    6 389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant perpétuel
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2009
    Messages : 6 389
    Points : 22 933
    Points
    22 933
    Billets dans le blog
    125
    Par défaut
    Bonsoir.

    Mon prototype retourne un array de toutes les occurences dans la chaine.
    Tu recupères directement deux arrays l'un des produits, l'autres de codes.
    J'ai même compris le truc !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    var str = "produit1 : 321321654321, produit2 :54231fds , produit3 : dfaaa2-22f"
    var reg = /\d+/g;
    var tab = [];
    var item = null;
     
    while(item = reg.exec(str)){
    	tab.push(item);
    }
     
    //  [["1"], ["321321654321"], ["2"], ["54231"], ["3"], ["2"], ["22"]]
    console.log(tab);
    Cela fonctionne grâce à reg.lastIndex. On pourrait donc dire que « retourne un array de toutes les occurrences » c'est quasi implémenté d'origine.

    Blog

    Sans l'analyse et la conception, la programmation est l'art d'ajouter des bogues à un fichier texte vide.
    (Louis Srygley : Without requirements or design, programming is the art of adding bugs to an empty text file.)

  7. #7
    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 637
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    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 637
    Points : 66 658
    Points
    66 658
    Billets dans le blog
    1
    Par défaut
    ben presque mais Last = juste le dernier ...
    donc le exec laise le pointeur sur la première occurence et lastIndex intercepte le dernier le dernier.
    A moins qu'il n'y ait une autre methode qui m'est encore inconnue, j'ai été obligé de boucler pour intercepter les autres ...
    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 !

  8. #8
    Expert éminent sénior
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 648
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 648
    Points : 11 137
    Points
    11 137
    Par défaut
    Citation Envoyé par danielhagnoul Voir le message
    Cela fonctionne grâce à reg.lastIndex. On pourrait donc dire que « retourne un array de toutes les occurrences » c'est quasi implémenté d'origine.
    lastIndex est implémentée sous IE 8 ? Sous IE 6 et 7 ce n'est pas le cas.

    SpaceForg : avec la méthode exec et IE tu n'as pas le fameux bug "1 coup sur 2" ?

  9. #9
    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 637
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    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 637
    Points : 66 658
    Points
    66 658
    Billets dans le blog
    1
    Par défaut
    Justement non Auteur le fameux un sur deux provient du fait que js laisse le pointeur de la regexp sur la dernière occurrence

    si tu prends par exemple le chaine
    trucmachinbiduletrucmachinbidule
    et que tu lui fais un exec /truc/ une première fois, elle matche la première occurence et laisse le pointeur dessus
    trucmachinbiduletrucmachinbidule
    au seconde exec sans reinitialiser la reg elle s'arrete sur la seconde
    trucmachinbiduletrucmachinbidule
    à la troisième sans reinitialiser il ne trouve pas d'occurrence
    Donc dans cette configuration on à deux coups sur trois...
    D'où le principe de la boucle exec qui matche jusqu'à ce que le pointeur arrive en bout de chaine sans trouver d'occurrence en partant de la dernière occurrence matchée pas le pas précédent.
    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 !

  10. #10
    Rédacteur

    Avatar de danielhagnoul
    Homme Profil pro
    Étudiant perpétuel
    Inscrit en
    Février 2009
    Messages
    6 389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant perpétuel
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2009
    Messages : 6 389
    Points : 22 933
    Points
    22 933
    Billets dans le blog
    125
    Par défaut
    Citation Envoyé par Auteur Voir le message
    lastIndex est implémentée sous IE 8 ? Sous IE 6 et 7 ce n'est pas le cas.

    SpaceForg : avec la méthode exec et IE tu n'as pas le fameux bug "1 coup sur 2" ?
    Suivant http://www.w3schools.com/jsref/jsref..._lastindex.asp c'est implémenté sur tous les navigateurs.

    Blog

    Sans l'analyse et la conception, la programmation est l'art d'ajouter des bogues à un fichier texte vide.
    (Louis Srygley : Without requirements or design, programming is the art of adding bugs to an empty text file.)

Discussions similaires

  1. Expression régulières en javascript
    Par nicko_73 dans le forum Général JavaScript
    Réponses: 10
    Dernier message: 04/11/2009, 19h37
  2. Expression régulière en javascript
    Par vikti dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 14/05/2008, 18h29
  3. Passage algo - code pour génération d'expressions régulières
    Par deedoo dans le forum Général Python
    Réponses: 6
    Dernier message: 11/08/2005, 14h32
  4. need help pour : boucle & expression régulière
    Par Fabouney dans le forum Langage
    Réponses: 5
    Dernier message: 05/08/2005, 02h22
  5. [Javascript] Expressions régulières
    Par JohnBlatt dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 11/10/2004, 15h46

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