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 :

Aide avec RegExp


Sujet :

Ruby

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 61
    Points : 37
    Points
    37
    Par défaut Aide avec RegExp
    Bonjour a tous !

    Je rencontre actuellement un problème avec une expression régulière.
    En effet, je cherche a filtrer uniquement des chaines contenant des chiffres et les caractères +,-, . et x, et cela 0 ou plusieurs fois.

    J'ai déjà pondu ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    def is_expr(s)
      s.to_s.match(/[\+-x\d\.]*/) == nil ? false : true
    end
    Quelques exemples d'expressions devant fonctionner :

    1+2+4
    1x-3x9+10
    1x5x6

    Évidemment tout caractère supplémentaire placer n'importe ou dans l'expression devrait faire échouer le test.

    De plus, j'aimerais également pouvoir vérifier que les caractères x et + soient au moins présents une fois dans la string, peut importe leur place, qu'ils soient la tout les deux ou non, tout en vérifiant également qu'ils soient systématiquement suivi d'un chiffre.

    Merci d'avance a ceux qui sauront m'aider.

    Bonne continuation

    wILL

  2. #2
    Membre averti Avatar de Javix
    Inscrit en
    Juin 2007
    Messages
    531
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 531
    Points : 353
    Points
    353
    Par défaut
    Citation Envoyé par will74 Voir le message

    J'ai déjà pondu ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    def is_expr(s)
      s.to_s.match(/[\+-x\d\.]*/) == nil ? false : true
    end
    1. Pas besoin de vérifier pour nil, juste comme ça sera plus court:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    def is_expr(s)
      s.match(/[+\-x\d.]/)
    end
    Pas besoin non plus de précéder '+' et '.' avec 'backslash' : '+' est au début de l'expression et la signification de . | ( ) { + ^ $ * ?—est désactivée à l'intérieur des parenthèses [].
    2. Tu peux t'exercer sur la Regex ici: http://www.rubular.com/

    3. Sinon, je l'aurais fait en deux étapes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    def is_expr(s)
      result = false
     second_pattern = /[-\d.]/
     firsrt_pattern = /x+|\+{1,}/
     str = "x-3x9+10"
     if firsrt_pattern.match(str)
       if second_pattern.match(str)
         result = true
       end
     end
    result
    end

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 61
    Points : 37
    Points
    37
    Par défaut
    Bonjour et merci pour ta réponse.

    Je ne remet pas en question ta RegExp, mais cela ne marche toujours pas, et je pense que cela vient de match ou de la valeur renvoyé.

    J'ai teste ta dernière fonction pour is_expr, en rajoutant juste return(result), et il ne filtre toujours pas correctement.

    Dans un main je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    def main(expr)
      if (is_expr(expr))
        .....
      else
       print_usage
      end
    end
    La j'avoue que je sèche, le résultat est pourtant teste, et sa passe quand même.

    PS : J'ai tester avec :

    1+2+4*
    1o+2z
    ...
    Merci d'avance

  4. #4
    Membre averti Avatar de Javix
    Inscrit en
    Juin 2007
    Messages
    531
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 531
    Points : 353
    Points
    353
    Par défaut
    Essaye ça:
    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
     
    def is_expr(str)
      result = false
      x_pattern = /x+/
      plus_pattern = /\+{1,}/
      main_pattern = /[-\d.]/
      if x_pattern.match(str) && plus_pattern.match(str)
        if main_pattern.match(str)
          result = true
        end
      end
      result
    end
     
    puts "#{is_expr("1+2+4*")}"
    J'ai oublié que tu voulais 'x' ET '+' au moins 1 fois et non 'OU'.

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 61
    Points : 37
    Points
    37
    Par défaut
    1+2+4* => true
    1+o+3x6 => true

    Cela passe encore avec des caracteres non souhaites, a savoir tout sauf 0-9, +, -, ., x.


    Merci d'avance

  6. #6
    Membre éprouvé

    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    552
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2007
    Messages : 552
    Points : 1 058
    Points
    1 058
    Par défaut
    Voici ce que je propose pour tester la présence de caractère non valides :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    VALID_CHARS=/^[\+\-x\.\d]$/
    class String
     def valid_chars?
      ret=true
      self.each_char{|c| ret=false unless c=~VALID_CHARS}
      ret
     end
    end
     
    p '1+2+4'.valid_chars?
    p '1x-3x9+10'.valid_chars?
    p '1+2+4x'.valid_chars?
    p '1+2+4*'.valid_chars?
    p '1+o+3x6'.valid_chars?
    ZiK un lecteur audio et son blog.

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

Discussions similaires

  1. [RegExp] Besoin d'aide avec RegExp
    Par tazquebec dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 18/06/2014, 08h33
  2. Réponses: 10
    Dernier message: 08/04/2013, 16h52
  3. Besoin d'aide avec Regexp::Assemble
    Par mobscene dans le forum Modules
    Réponses: 5
    Dernier message: 11/04/2007, 12h39
  4. Besoin d'aide avec regexp
    Par goblin dans le forum Langage
    Réponses: 3
    Dernier message: 04/12/2005, 04h27
  5. Besoin d'aide avec postgresql sous windows NT
    Par Chihuahua dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 18/07/2003, 08h29

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