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 :

récupérer un nombre indéfini d'occurrences avec .exec [RegExp]


Sujet :

JavaScript

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    155
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 155
    Points : 75
    Points
    75
    Par défaut récupérer un nombre indéfini d'occurrences avec .exec
    Bonjour, je bloque sur un truc sans doute très simple ..

    Je cherche à récupérer les entiers définis dans ce type de ligne (les lignes commencent par un "L" minuscule, ce n'est pas un "1") :
    Ces lignes sont bien sûr au milieu d'autres, et le nombre d'entiers est quelconque (mais au moins 2).

    J'ai l'expression régulière suivante (où 'line' = chaîne des lignes d'un fichier)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    var pattern = /l( +\d+)+/
    ..
    var result = pattern.exec( line )
    Pourquoi est ce que j'obtiens le tableau suivant, avec uniquement le dernier entier de la ligne et pas les autres ??
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ["l 9 10 11 13", " 13"]
    C'est un problème de pattern ou c'est du à exec ?
    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 641
    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 641
    Points : 66 666
    Points
    66 666
    Billets dans le blog
    1
    Par défaut
    les deux...
    il faut passer par match pour recupérer les groupes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    foo="l 9 10 11 13"
    bar=foo.match(/ \d+/g)
    alert(bar)

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    155
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 155
    Points : 75
    Points
    75
    Par défaut
    Ah ok, merci.

    Mais en fait dans mon fichier il y a d'autres lignes qu'il faut ignorer, j'ai donc un test dans une boucle d'itération des lignes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ..
    else if ( ( result = pattern.exec( line ) ) !== null ) {
    ...
    Du coup ça m'oblige à faire 2 expressions régulières, comme ça ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    ..
    else if ( ( result = pattern.exec( line ) ) !== null ) {
      result = result[0].match(/ \d+/g);
      ..
    }
    ...
    C'est pas très catholique non ?

    EDIT : dans ce cas dans le même genre il y a aussi ça ..
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    result = result[0].split(' ');
    result.shift()

  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 641
    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 641
    Points : 66 666
    Points
    66 666
    Billets dans le blog
    1
    Par défaut
    montre plutot un extrait de ton fichier ...

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    155
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 155
    Points : 75
    Points
    75
    Par défaut
    Ok, mais tu l'auras voulu ...
    Alors c'est pour un nouveau proto de loader pour three.js (j'adore) dérivé de celui là pour les fichiers .obj

    Dans les grandes lignes, voilà une partie de fichier .obj qui m'intéresse :
    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
    #
    # shape Line03
    #
     
    v  -2.4500 4.6650 -4.0500
    v  5.5500 -1.6650 0.2500
    # 2 vertices
     
    g Line03
    usemtl wire_028028177
    l 1587 1588
     
    #
    # shape Line05
    #
     
    v  4.6788 0.0000 -9.9241
    ...
    v  10.0931 0.0000 -10.4248
    # 101 vertices
     
    g Line05
    usemtl wire_214228153
    l 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 1658 1659 1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 1674 1675 1676 1677 1678 1679 1680 1681 1682 1683 1684 1685 1686 1687 1688 1689
    Les "v .." (vertex) sont déjà traités, et je veux uniquement récupérer les "l .." qui sont en nombre indéfini

    Voilà le bout de code (le paramètre data vient d'une xhr) :

    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
    39
    40
    41
    42
    43
    parse: function ( data ) {
     
    		var vertex_pattern = /v( +[\d|\.|\+|\-|e]+)( +[\d|\.|\+|\-|e]+)( +[\d|\.|\+|\-|e]+)/;
     
    		// mon truc ..
    		// the new regex for indeterminate number of points
    		// l vertex vertex vertex ...
    		var line_pattern = /l( +\d+)+/
     
    		//
     
    		var lines = data.split( "\n" );
     
    		for ( var i = 0; i < lines.length; i ++ ) {
     
    			var line = lines[ i ];
    			line = line.trim();
     
    			var result;
     
    			if ( line.length === 0 || line.charAt( 0 ) === '#' ) {
     
    				continue;
     
    			} else if ( ( result = vertex_pattern.exec( line ) ) !== null ) {
     
    				// ["v 1.0 2.0 3.0", "1.0", "2.0", "3.0"]
    				// ..
    				// traitement des vertex
     
    			// My Lines treatment
    			} else if ( ( result = line_pattern.exec( line ) ) !== null ) {
     
    				// ["l 1 2 3 ..", last]
    				result = result[0].split(' ');
    				result.shift()
     
    				...
     
    				// ici j'ai besoin du tableau de point de la ligne "l ..."
    			}
     
    		}
    En même temps mon bricolage fonctionne ... je le trouve juste un peu bricolé mais ça marche.

  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 641
    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 641
    Points : 66 666
    Points
    66 666
    Billets dans le blog
    1
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    chaine='l 1587 1588\r\n\
    l 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 1658 1659 1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 1674 1675 1676 1677 1678 1679 1680 1681 1682 1683 1684 1685 1686 1687 1688 1689';
     
    ltab=chaine.match(/^(?:l)(\s\d+)+$/gm)
    i=-1
     
    while(ltab[++i]){
    ltab[i]=ltab[i].split(' ')
    ltab[i].shift()
    }
    alert(ltab[0])
    alert(ltab[1])
    Ici la j'ai rajouté les retours ligne dans la chaine pour l'exemple, mais cela devrait fonctionner avec ta chaine récupérée

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    155
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 155
    Points : 75
    Points
    75
    Par défaut
    D'accord, tu mettrais aussi split + shift (je croyais qu'on pouvais obtenir directement le tableau).

    Merci d'avoir pris le temps

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

Discussions similaires

  1. Réponses: 9
    Dernier message: 13/12/2013, 09h55
  2. Récupérer les données d'un formulaire avec un nombre de champs similaires évolutifs
    Par jimmyneutron dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 20/03/2012, 23h14
  3. Réponses: 1
    Dernier message: 01/03/2010, 11h15
  4. Réponses: 2
    Dernier message: 20/03/2007, 13h39
  5. Réponses: 3
    Dernier message: 28/10/2006, 15h47

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