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

Java Discussion :

Expression régulière de contrôle d'une chaîne de caractères


Sujet :

Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Mai 2011
    Messages
    790
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations forums :
    Inscription : Mai 2011
    Messages : 790
    Par défaut Expression régulière de contrôle d'une chaîne de caractères
    Bonjour ,

    Je souhaite effectuer un contrôle sur une chaîne de caractère tel que cette chaîne doit toujours contenir des nombres tels que 1 , 8 , ou 8.2 ou 7.1 suivie de //

    Exemple 1//1.2//0.5//0.25

    Quelqu'un saurait-il m'aiguiller un peu ?

    Merci d'avance pour votre aide.

  2. #2
    Expert confirmé Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 987
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 987
    Par défaut
    Quelle difficulté rencontres-tu?

  3. #3
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Mai 2011
    Messages
    790
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations forums :
    Inscription : Mai 2011
    Messages : 790
    Par défaut
    la difficulté c'est que je n'arrive pas à écrire la bonne expression j'ai fait ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    private static final String Number_PATTERN = "[0-9]*//";
    Mais je n'arrive pas encore à exploiter parce que je pourrai avoir un 0.25 par exemple et toujours chaque nombre est suivi d'un //

  4. #4
    Expert confirmé Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 987
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 987
    Par défaut
    Ok, pour l'instant tu as déjà trouvé comment décrire un entier suivi de deux slashes, sauf que tu n'as pas choisi le bon quantificateur. En effet, * signifie "zéro ou plus", pour être sûr d'avoir au moins un chiffre tu devrais plutôt prendre + "un ou plus".

    Pour ce qui est des nombres décimaux, c'est pas vraiment plus difficile. Le plus simple consiste à ajouter le point dans la classe de caractère: [0-9.], mais cette solution est un peu naïve car elle autorise ça: 1., .1, ., .., 1..1 (En d'autre termes, c'est suffisant pour trouver un nombre décimal (ou entier), mais pas pour vérifier qu'une sous-chaîne est un nombre décimal ou entier.

    Donc on va plutôt utiliser une description plus explicite: [0-9]+(?>\\.[0-9]+)? en mettant la partie décimale dans un groupe que l'on rend optionel avec ?.

    On a maintenant le pattern [0-9]+(?>\\.[0-9]+)?// qui permet de trouver tous les nombres suivis de deux slashes. Maintenant il ne reste plus qu'à s'assurer que toute la chaîne en est composée du début à la fin.

    Pour cela, il suffit d'ajouter des ancres de début ^ et de fin de chaîne $ et de répéter le pattern: ^(?>[0-9]+(?>\\.[0-9]+)?//)+$.

    D'après l'exemple de ton premier message, il semble que le dernier nombre de la chaîne n'a pas besoin d'être suivi de deux slashes, dans ce cas utilise plutôt: ^(?>[0-9]+(?>\\.[0-9]+)?//)*[0-9]+(?>\\.[0-9]+)?$ ou encore ^(?>[0-9]+(?>\\.[0-9]+)?(?://|$))+$.

    [EDIT]
    Cette deuxième version est fausse car elle autorise // à la fin. Par contre la première version sera plus efficace si on la retourne: ^[0-9]+(?>\\.[0-9]+)?(?>//[0-9]+(?>\\.[0-9]+)?)*$.
    [/EDIT]

    Autre méthode: Tu peux d'abord splitter la chaîne avec // puis vérifier que chaque morceau est un nombre avec ^[0-9]+(?>\\.[0-9]+)?$ ou peut être par un simple jeu de cast.

  5. #5
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 585
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 585
    Par défaut
    Euuuh, ouais, enfin, les ?> et les ?: et les ^ et les $ ne servent à rien.

    Avec le même principe ce serait simplement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ([0-9]+(\\.[0-9]+)?(//|$))+
    ou

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (\\d+(\\.\\d+)?(//|$))+
    suivant ce qu'on estime être le plus simple.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  6. #6
    Expert confirmé Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 987
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 987
    Par défaut
    Ce qui ne sert à rien c'est de consommer de la mémoire avec des captures qui ne serviront jamais, d'où l'utilisation de groupes non-capturants. À propos du groupe atomique, si son utilité ne se révèle pas forcément dans le cas d'une chaîne au bon format, il prend par contre tout son sens avec une chaîne contenant par exemple une lettre à la fin. Le travail imposé au moteur de regex n'a alors plus rien à voir avant que le pattern échoue.

    Pour ce qui est des ancres ^ et $, si tu utilises la méthode Matcher.matches elles ne sont éffectivement pas nécessaires. Par contre si tu utilises la méthode Matcher.find ou Matcher.lookingAt et que tu les enlèves, c'est simple tu ne contrôles plus rien et la pattern peut renvoyer un résultat pour n'importe quelle chaîne du moment qu'elle contient un nombre suivi de deux slashs ou un nombre en fin de chaîne.

    En ce qui concerne cette version du pattern en lui-même, je viens de me rendre compte qu'elle était fausse car elle autorise deux slashs en fin de chaîne. Donc mieux vaut utiliser l'autre qui répète le sous pattern du nombre à la fin, ou plutôt sa variante inversée qui demande moins de travail.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 13/12/2013, 13h37
  2. Contrôle d'une chaîne de caractère
    Par Pamplonica dans le forum Designer
    Réponses: 3
    Dernier message: 11/07/2011, 19h48
  3. Contrôle sur une chaîne de caractères
    Par jaussiba dans le forum SQL
    Réponses: 4
    Dernier message: 18/02/2011, 10h16
  4. [FAQ] Comment tester une chaîne de caractères avec une expression régulière ?
    Par Baptiste Wicht dans le forum Vos Contributions VBScript
    Réponses: 1
    Dernier message: 20/11/2007, 20h43
  5. Réponses: 22
    Dernier message: 18/07/2006, 16h05

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