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

Ruby Discussion :

extraction d'un nombre inconnu d'arguments


Sujet :

Ruby

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Août 2005
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2005
    Messages : 163
    Points : 45
    Points
    45
    Par défaut extraction d'un nombre inconnu d'arguments
    J'aimerais par une expression régulière extraire une suite d'arguments après un nom de fonction. Chaque argument est séparé par une virgule et est composé d'un mot clé et d'une valeur. La valeur est une string. La fin de ligne termine la fonction.
    Il y a au minimum un argument à la fonction.

    Exemple:
    nom_fonction arg1 val1 , arg2 val2 , ... argN valN

    au minimum:
    nom_fonction arg1 val1

    J'ai essayé avec l'excellent outil Rubular mais sans connaissance des regex, on arrive à rien.

    (\w+)(\s+)(.....)+
    ........ pour extraire nom_fonction = $1
    ....... pour extraire les espaces = $2
    ......... extraire un ou plusieurs fois


    Pouvez-vous m'aider ?
    Merci

  2. #2
    Membre habitué Avatar de denissay
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2006
    Messages : 103
    Points : 125
    Points
    125
    Par défaut
    Une manière de procéder serai d'utiliser le \G comme suit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (?:nom_fonction |\G(?<!^)) *(\S+\s+\S+)\s*,?
    DEMO

    Ça pourrait être encore simplifié d'avantage si tu donnes plus d'exemples d'entrées... Sinon, ça doit faire le boulot
    Une réponse utile vous a aidé ? N'oubliez pas le
    Votre problème est résolu ? N'oubliez pas le

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Août 2005
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2005
    Messages : 163
    Points : 45
    Points
    45
    Par défaut
    Je suis bluffé car je ne partait pas dans la bonne direction avec mon (\w+)
    \G existe pour tous les langages, Ruby en particuliers ?
    Dans quelle variable se trouve nom_fonction ? $1 ?
    Que voudrais-tu savoir pour simplifier encore ? comme ça:

    capital france paris,italie rome , allemagne berlin, angleterre londres
    nom_fonction = capital

    monnaie europe euro , etats-unis dollar, japon yen
    nom_fonction = monnaie

    J'ai oublié de dire que le nombre d'espaces entre chaque mots est variable.
    J'abuse: comment savoir le nombre d'arguments N ?

    Un grand merci déjà.

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Août 2005
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2005
    Messages : 163
    Points : 45
    Points
    45
    Par défaut
    Entre temps j'ai testé avec Rubular et cela ne marche pas
    Avec un autre outil j'ai le message: Ruby doesn't support lookbehind

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Août 2005
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2005
    Messages : 163
    Points : 45
    Points
    45
    Par défaut
    Ça ne marchait pas car cela dépend de la version de Ruby !
    J'ai changé votre solution pour accepter n'importe quel nom de fonction, j'espère que c'est bon:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (?:(\w+)(\s+)|\G(?<!^)) *(\S+\s+\S+)\s*,?
    il y a un espace ici .......^
    On ne peut pas le supprimer ou le remplacer ?

  6. #6
    Membre habitué Avatar de denissay
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2006
    Messages : 103
    Points : 125
    Points
    125
    Par défaut
    Désloé pour cette réponse tardive, j'avais bien vu ta réaction hier at j'ai cru y avoir répondu xD

    Tu as bien fais de remplacer par (\w+) pour capturer le nom de la fonction...

    Quand à l'espace il est bien necessaire et tu peux vérifier que l'expression ne marchera plus si tu l'enlèves... Si tu veux absolument le remplacer pour le rendre plus visible, tu peux le mettre entre [ ], ou le remplacer par un \s (même principe pour le \s entre les deux \S)

    ce qui donnera :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (?:(\w+)\s|\G(?<!^))[ ]*(\S+[ ]+\S+)\s*,?
    DEMO
    Une réponse utile vous a aidé ? N'oubliez pas le
    Votre problème est résolu ? N'oubliez pas le

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Août 2005
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2005
    Messages : 163
    Points : 45
    Points
    45
    Par défaut
    Merci pour le suivi ...
    et comment savoir le nombre d'arguments de la fonction ( un argument = un mot + une valeur) ?

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Août 2005
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2005
    Messages : 163
    Points : 45
    Points
    45
    Par défaut
    comment fait-on pour traiter match après match ?
    en pseudo code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     while not eol do
      extraction de `argx valx`
      traitement du match
     end while
    Je pensais à:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    while string =~ /regex/ do
    ....
    end
    =~ retourne la position du match (true) ou nil (false)

    je reste toujours sur le premier match !

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Août 2005
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2005
    Messages : 163
    Points : 45
    Points
    45
    Par défaut
    Exemple concrêt
    mystring:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    capital france paris,italie rome , allemagne berlin, angleterre londres
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    while mystring =~ /(?:(\w+)(\s+)|\G(?<!^))[ ]*(\S+[ ]+\S+)\s*,?/i
     case $3
     when 'france paris'
     ... 
     when ...
     ...
     else
     end
    end
    Je reste toujours sur 'france paris' !?

Discussions similaires

  1. Réponses: 8
    Dernier message: 08/06/2006, 18h05
  2. Réponses: 2
    Dernier message: 09/06/2005, 10h49
  3. Comment gérer un nombre inconnu d'objet ?
    Par Clad3 dans le forum C++
    Réponses: 28
    Dernier message: 12/03/2005, 12h55
  4. [Fortran 90] Nombre variable d'arguments
    Par Zoera dans le forum Fortran
    Réponses: 2
    Dernier message: 08/03/2005, 14h08
  5. Procédure avec un nombre variable d'arguments
    Par charly dans le forum Langage
    Réponses: 15
    Dernier message: 21/06/2002, 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