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 :

JS et expression régulière mal interprétée


Sujet :

JavaScript

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    123
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 123
    Points : 85
    Points
    85
    Par défaut JS et expression régulière mal interprétée
    Bonjour à tous

    J'effectue un controle de saisie via une expression régulière d'un nombre décimal poisitif ou négatif, avec ou sans virugule)

    J'utilise pour cela l'expression régulière
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    (?:-)?(?:[1-9]{1}[0-9]*|0{1})(?:(?:\.|,)[0-9]*[1-9]{1})?
    Qui marche très bien en C# mais pas en Javascript (IE8 et FF3)

    En effet une saisie comme 000001 est acceptée alors qu'elle ne le devrait pas

    Par contre l'inversion du genre 1.2500000 est refusé et bien remplacé par 1.25

    Le code JS est le suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    result = (new RegExp('(?:-)?(?:[1-9]{1}[0-9]*|0{1})(?:(?:\.|,)[0-9]*[1-9]{1})?','')).exec(chaine);
    chaine = (result != null) ? result[0] : '';
    Notons que le code JS suivant produit le même résultat
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    result = (new String(chaine)).match('(?:-)?(?:[1-9]{1}[0-9]*|0{1})(?:(?:\.|,)[0-9]*[1-9]{1})?');
    chaine = (result != null) ? result[0] : '';

    Une idée sur la raison ?

  2. #2
    Membre émérite Avatar de franculo_caoulene
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 880
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 880
    Points : 2 953
    Points
    2 953
    Par défaut
    Salut,

    La syntaxe n'est pas la même entre les langages. Je proposerais ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ^([1-9]{1}\d*|0{1})([.,]\d*[1-9]{1})*$
    Pour plus d'information :
    https://developer.mozilla.org/En/Cor...Objects/RegExp
    http://jacques-guizol.developpez.com...Exp.php#VIII.1

    Pour tester :
    http://jacques-guizol.developpez.com...TestExReg.html
    Les Cours et tutoriels JavaScript
    Penser à la recherche et au bouton

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    319
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2006
    Messages : 319
    Points : 351
    Points
    351
    Par défaut
    "000001" convient très bien à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    /(?:-)?(?:[1-9]{1}[0-9]*|0{1})(?:(?:\.|,)[0-9]*[1-9]{1})?/
    Décortiquons :

    Tu n'as pas inclus "^" en début d'expression donc on commence où on veut :

    Permier caractère, un zéro :

    (?:-)? -> [OUI] pas de signe négatif
    [1-9]{1}[0-9]* -> [NON] passons à l'autre clause dans la condition "ou"
    0{1} -> [OUI]

    La suite ? Elle est facultative : d'une part parce que tu n'as pas mis de "$" final et d'autre part parce que la dernière portion de ton expression est... facultative, en effet ("?").


    Ça ne devrait pas dépendre du langage. JavaScript implémente les expressions de type PERL (pas tout à fait entièrement, hélàs). Peut-être que C# s'en écarte un peu ? Java, lui aussi, implémente PERL (avec peut-être qq variations, je ne me souviens plus) mais force est de constater que, dans l'ensemble, les deux langages donnent les mêmes résultats. Comme exceptions on pourra citer certaines classes de caratères comme \p{L}, etc. : JavaScript ne les supporte pas.

  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 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 669
    Points
    66 669
    Billets dans le blog
    1
    Par défaut
    je ne suis pas sur que (?: ) soit implémenté en js ... ?
    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 !

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    319
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2006
    Messages : 319
    Points : 351
    Points
    351
    Par défaut
    Si, heureusement ! ^^

    Et même ça - si on veut parler de notations tordues :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ^(?=^([a-zA-Z-]+)\s*\/\s*([a-zA-Z-]+)\s*$).{1,60}$
    (correspond à "Smith / John", par exemple, dans une limite maximum de 60 caractères)


    P.S. : voici un petit outil intéressant, et j'espère bientôt pouvoir vous donner le lien vers mon site avec un outils plus évolué.

  6. #6
    Membre émérite Avatar de franculo_caoulene
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 880
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 880
    Points : 2 953
    Points
    2 953
    Par défaut
    Ah ouai tiens, je ne connaissais pas cette syntaxe.
    Les Cours et tutoriels JavaScript
    Penser à la recherche et au bouton

  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 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 669
    Points
    66 669
    Billets dans le blog
    1
    Par défaut
    ou pour les ?= ?> etc mais je ne trouve rien sur les groupes non capturants ..
    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
    Membre averti
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    319
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2006
    Messages : 319
    Points : 351
    Points
    351
    Par défaut
    Tu ne trouves rien ? Bah, essaye, c'est encore plus rapide que de chercher !

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    123
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 123
    Points : 85
    Points
    85
    Par défaut
    Merci de vos réponses,

    Citation Envoyé par Oscar Hiboux Voir le message
    "000001" convient très bien à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    /(?:-)?(?:[1-9]{1}[0-9]*|0{1})(?:(?:\.|,)[0-9]*[1-9]{1})?/
    Décortiquons :
    (?:-)? -> [OUI] pas de signe négatif
    [1-9]{1}[0-9]* -> [NON] passons à l'autre clause dans la condition "ou"
    0{1} -> [OUI]
    Certes mais dans ce cas, seule le 0 correspond et pas les autres 00001. Donc l'expression est vérifiée mais match devrait renvoyer seulement le 0 initial et pas les autres chiffres

  10. #10
    Membre expérimenté
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    1 132
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 132
    Points : 1 418
    Points
    1 418
    Par défaut
    Je ne suis pas coutumier de l'utilisation des expressions régulières en Javascript mais le masque étant passé sous forme de chaîne ne faudrait-il pas doubler les antislashs ?


    devYan.

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    319
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2006
    Messages : 319
    Points : 351
    Points
    351
    Par défaut
    Ah oui, ça m'y fait penser... J'ai failli oublier !

    Préfère écrire ton expression sous la forme /expression/options plutôt que new RegExp("expression", "options") parce que comme le souligne devyan, si tu fais ainsi il faudra échapper certains caractères et ça va devenir assez vite illisible (comment ça c'est déjà illisible les motifs ?.. ) et voué à l'erreur. La première forme est aussi plus concise.

Discussions similaires

  1. [Shell]Du mal avec expression régulière
    Par Leniouns dans le forum Linux
    Réponses: 3
    Dernier message: 04/09/2011, 10h59
  2. Réponses: 6
    Dernier message: 02/06/2011, 15h40
  3. [expression régulière] mon cerveau fait des noeuds..
    Par nawac dans le forum Algorithmes et structures de données
    Réponses: 7
    Dernier message: 27/05/2003, 10h06
  4. Expressions réguliéres
    Par Tooms dans le forum Langage
    Réponses: 4
    Dernier message: 06/12/2002, 18h42
  5. Réponses: 5
    Dernier message: 11/06/2002, 15h21

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