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 :

Est-ce possible avec les expressions régulières ? [RegExp]


Sujet :

JavaScript

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    159
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 159
    Points : 91
    Points
    91
    Par défaut Est-ce possible avec les expressions régulières ?
    Bonjour,

    Je dispose d'une chaine de caractère de cette forme à traiter :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "scale(0.378947 0.378947) translate(-1194 2086) rotate(90)"
    Je cherche, par une expression régulière, à récupérer le contenu des parenthèses en fonction du mot devant.

    Par exemple, pour récupérer le contenu de scale, je dispose de l'expression suivante (pas forcément la bonne) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var reScaleAttributes = /scale\((.*)\)/;
    Je souhaiterais donc, utiliser la méthode test() de reScaleAttributes sur ma chaine, et ne sortir que la partie entre parenthèse.

    Je crois qu'on peut accèder aux expressions parenthèsée par $1, mais je n'arrive pas à y accèder après l'appel à la fonction test().

    En gros, je voudrais faire un truc du genre, mais ça en marche pas pour le moment.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    var reScaleAttributes = /scale\((.*)\)/;
    if(reScaleAttributes.test(transformAttributes))
    	alert(reScaleAttributes);

  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
    utilise search, de préférence;

  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 640
    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 640
    Points : 66 663
    Points
    66 663
    Billets dans le blog
    1
    Par défaut
    un truc comme ça ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <script type='text/javascript'>
    var chaine="scale(0.378947 0.378947) translate(-1194 2086) rotate(90)"
    reg=/(\w+)\(([0-9. -]+)\)/gi;
    var res={}
    var match;
    while (match = reg.exec(chaine)) {
      res[match[1]]= match[2];
    }
     
    alert(res.scale)
    </script>
    explication:
    contrairement à php on ne peut pas matcher toutes les occurrences en une seule fois.
    Il faut faire un premier exec et là le pointeur de la regexp s'arrête sur la première occurrence trouvée ... (un classique appelé le "une fois sur deux" sur developpez ^^ pour les habitués)
    Donc si on boucle avec un while exec on va passer en revue une à une toutes les occurrences du pattern et du coup pouvoir recupérer à chaque occurrence les niveaux de parenthèses.

    php peut faire cette opération en une seule fois avec des groupes nommés et recuperer ainsi directement un array associatif

  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
    ou ça, dans ton cas?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    alert(str.match(/scale\([\d\. ]+/)[0].substring(6))

  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 640
    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 640
    Points : 66 663
    Points
    66 663
    Billets dans le blog
    1
    Par défaut
    Par exemple, pour récupérer le contenu de scale
    je pense que tu es trop minimaliste JT

  6. #6
    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
    ben quoi? je récupère pas le contenu de scale là?

  7. #7
    Expert éminent sénior

    Avatar de vermine
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    6 582
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2008
    Messages : 6 582
    Points : 79 912
    Points
    79 912
    Par défaut
    Je pense qu'il faut aussi récupérer translate et rotate, javatwister. D'où l'expression de SpaceFrog.

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    159
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 159
    Points : 91
    Points
    91
    Par défaut
    Merci à tous pour vos réponses plus que complètes !

    Je n'ai pas encore tester vos solutions, et comme je code trop toute la journée, je n'aurais pas le courage (je pense) d'essayer ça ce soir.

    @javatwister : je ne comprend pas ton .substring(6) ? Je pensais tout faire à l'aide d'une expression régulière !

    @SpaceFrog : ta solution parait très élégante et complète, je pense quand même ne pas utiliser le pattern (\w+) mais les mots clef, ce qui me permettra d'identifier directement les données.
    Sinon, ça m'a l'air satisfaisant, je teste ça demain et je vous dis de quoi il en retourne !

  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 640
    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 640
    Points : 66 663
    Points
    66 663
    Billets dans le blog
    1
    Par défaut
    justement non !!

    ma solution te propose un array associatif
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <script type='text/javascript'>
    var chaine="scale(0.378947 0.378947) translate(-1194 2086) rotate(90)"
    reg=/(\w+)\(([0-9. -]+)\)/gi;
    var res={}
    var match;
    while (match = reg.exec(chaine)) {
      res[match[1]]= match[2];
    }
     
    for (elt in res){
    alert(elt +"\t=>\t" + res[elt])
    }
    </script>
    et comme je code trop toute la journée, je n'aurais pas le courage (je pense) d'essayer ça ce soir.
    ha la nouvelle génération ! Nous on code toute la nuit .. aussi ...

  10. #10
    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
    ah oui d'accord, j'ai plus les trous en face des yeux;

    bravo SF! c'est tout bon!

    (Panoramix, je me sens un peu faible... )

  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    159
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 159
    Points : 91
    Points
    91
    Par défaut
    Bon, pour faire plaisir à "l'ancienne" génération, j'ai testé, c'est ce qu'il me faut.

    Pour en revenir à ton tableau associatif, c'est beau je te l'accorde.
    Mais comment tu accède à ses éléments ?
    Vraisemblablement, c'est de la comparaison de chaines de caractères, donc c'est long pour rien !

    Si je fait trois traitements, que je les stocke dans des variables adéquates, pour y accéder c'est du pointeur. Je préfère !

    En plus, selon mes besoins, j'aurais pas forcément besoin de tout les champs, en sachant qu'il peut y en avoir d'autre.

  12. #12
    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 640
    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 640
    Points : 66 663
    Points
    66 663
    Billets dans le blog
    1
    Par défaut
    ha ben comme ça alors:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    var chaine="scale(0.378947 0.378947) translate(-1194 2086) rotate(90)"
    String.prototype.getChamps=function(champs){
    var reg=new RegExp(champs+"\\(\([0-9. -]+\)\\)","i");
    matches=this.match(reg) 
    return (matches)?matches[1]:null;
    }
    alert(chaine.getChamps('rotate'))
    alert(chaine.getChamps('translate'))
    alert(chaine.getChamps('plonk'))

  13. #13
    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
    tiens ben avec un bon vieux search, ça marche aussi ... et sans boucle...

    oui bon d'accord, je triche
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    var chaine="scale(0.378947 0.378947) translate(-1194 2086) rotate(90)"
    reg=/([a-z]+)\(([\d. -]+)\)/g;
    r=chaine.replace(reg,"$1 : $2 \n").split("\n");
    alert(r)

  14. #14
    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 640
    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 640
    Points : 66 663
    Points
    66 663
    Billets dans le blog
    1
    Par défaut
    Certes JT mais du coup ça fait comme ma première proposition et ça recupère tout d'un coup ... ce qui ne convient pas à priori

    mon prototype permet de passer en paramètre le champs

    autre solution sans boucle:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    var chaine="scale(0.378947 0.378947) translate(-1194 2086) rotate(90)"
    reg=/(\b\()|(\) (?=\D))/g;
    r=chaine.replace(/[^0-9 .-]$/,'').split(reg);
    alert(r)

  15. #15
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    159
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 159
    Points : 91
    Points
    91
    Par défaut
    Merci à tous, je vois que vous étiez très inspirés ^^

    La solution de spacefrog me parait vraiment nickel ! Plus qu'a me créer une classe pour aller avec et ce sera bon !!

  16. #16
    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
    Promis, après j'arrête (c'est juste pour rigoler encore un coup);

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    var chaine="scale(0.378947 0.378947) translate(-1194 2086) rotate(90)";
     
    nom=chaine.match(/[a-z]+/g);
    valeur=chaine.match(/[\d. -]+(?=\))+/g);
     
    var chaine=[];
     
    for (index in nom){
    	chaine[nom[index]]=valeur[index];
    }
     
    alert(chaine.scale)
    alert(chaine.translate)
    alert(chaine.rotate)

  17. #17
    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 640
    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 640
    Points : 66 663
    Points
    66 663
    Billets dans le blog
    1

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

Discussions similaires

  1. [C#]Probleme avec les Expressions régulières
    Par akram46 dans le forum Windows Forms
    Réponses: 7
    Dernier message: 07/10/2006, 13h08
  2. doublons avec les expressions régulières
    Par Mister Nono dans le forum Langage
    Réponses: 8
    Dernier message: 16/09/2006, 12h14
  3. [VB.net][vs2005] Problème avec les expressions régulières
    Par zouhib dans le forum Windows Forms
    Réponses: 13
    Dernier message: 22/06/2006, 15h56
  4. Problème avec les expressions régulières
    Par Premium dans le forum Collection et Stream
    Réponses: 11
    Dernier message: 18/06/2006, 16h41
  5. Réponses: 8
    Dernier message: 13/12/2005, 14h02

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