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

Collection et Stream Java Discussion :

Parser chaine de caractere


Sujet :

Collection et Stream Java

  1. #1
    Membre averti
    Inscrit en
    Novembre 2004
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 53
    Par défaut Parser chaine de caractere
    Bonjour,

    je souhaiterais parser des chaines de ce type : "1..155" ou "3..9" ou "55..999"
    En fait [un entier][..][un entier]

    Je voudrais recuperer les 2 entiers ! Avez vous une idee pour implementer cela simplement ? la classe Stokenizer peut permettre ça ?

    merci d'avance.

  2. #2
    Membre chevronné Avatar de Bezout
    Profil pro
    Développement
    Inscrit en
    Septembre 2003
    Messages
    234
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : Développement

    Informations forums :
    Inscription : Septembre 2003
    Messages : 234
    Par défaut
    Simplement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    String[] entiers = "11..22".split("..");
    int nb1 = Integer.parseInt(entiers[0]);
    int nb2 = Integer.parseInt(entiers[1]);
    non ?

  3. #3
    Membre émérite Avatar de Gardyen
    Homme Profil pro
    Bio informaticien
    Inscrit en
    Août 2005
    Messages
    637
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bio informaticien

    Informations forums :
    Inscription : Août 2005
    Messages : 637
    Par défaut
    ne pas oublier qu'on a affaire à des patterns

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    String[] entiers = "11..22".split("\\.\\.");
    int nb1 = Integer.parseInt(entiers[0]);
    int nb2 = Integer.parseInt(entiers[1]);

  4. #4
    Membre chevronné Avatar de Bezout
    Profil pro
    Développement
    Inscrit en
    Septembre 2003
    Messages
    234
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : Développement

    Informations forums :
    Inscription : Septembre 2003
    Messages : 234
    Par défaut
    Exact j'ai meme pas testé, j'ai fait ca à l'arrache sous Ultra Edit

  5. #5
    Membre averti
    Inscrit en
    Novembre 2004
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 53
    Par défaut
    Merci pour votre reponse mais j'ai un peu sous estimé mon probleme. En fait, cette chaine peut etre formée ainsi : "2..5,13,12..99,26..158". Soit un entier soit 2 entiers séparés par "..". En gros, il faudrait que j'utilise une expression reguliere pour verifier que la chaine est bien formatée avant de pouvoir faire des Integer.parseint()! Mais j'y connais pas grand chose en expression reguliere.

  6. #6
    Membre averti
    Inscrit en
    Novembre 2004
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 53
    Par défaut
    bon après quelques essais je pense avoir trouvé l'expression reguliere qui verifie la chaine ci-dessus :

    String expressionReguliere = "[0-9]+|([0-9]+\\.\\.[0-9]+)[,[0-9]+|([0-9]+\\.\\.[0-9]+)]*";

    Si vous voyez plus simple, je prend

  7. #7
    Membre Expert
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    1 252
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 252
    Par défaut
    Ton expression régulière peut poser problème à divers moments. D'ailleurs, tu te trompes entre crochets et parenthèses. Celle-ci fait exactement ce que tu désires :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    String regExp = "^[0-9]+(\\.\\.[0-9]+)?(,[0-9]+(\\.\\.[0-9]+)?)*$"
     
    // Ce qui suit est strictement pareil, mais est là pour la compréhension :
    String reNumber = "[0-9]+"; // Définition d'un nombre
    String reRangeOperator = java.util.regex.Pattern.quote(".."); // Permet d'écrire ".." tel quel.
    String reRange = reNumber + "(" + reRangeOperator + reNumber + ")?";
    String reRangeList = reRange + "(," + reRange + ")*";
    String regExp = "^" + reRangeList + "$";
    Après, on pourra modifier reNumber par (0|[1-9][0-9]*) pour ne pas prendre en compte les cas spéciaux comme 000000000000 ou 0999999

  8. #8
    Membre averti
    Inscrit en
    Novembre 2004
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 53
    Par défaut
    merci dingoth, je me suis effectivement rendu compte aujourd'hui que certains cas n'etaient pas traités et surtout que j'utilisais mal les parentheses et crochets. N'ayant vu ton poste qu'apres mes modifs, j'ai donc corrigé avec cette expression (bien moins propre que la tienne) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    private static final String expressionReguliere = "([0-9]+|([0-9]+\\.\\.[0-9]+))(,[0-9]+|,([0-9]+\\.\\.[0-9]+))*";
    Les quelques tests que j'ai effectué m'ont semblé satisfaisant! Dans ton expression le ^ et le $ en debut et fin de chaine sont t'ils obligatoires ?

  9. #9
    Membre chevronné Avatar de T`lash
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Saint-Pierre-Et-Miq.

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Septembre 2007
    Messages : 381
    Par défaut
    Citation Envoyé par bouliz Voir le message
    merci dingoth, je me suis effectivement rendu compte aujourd'hui que certains cas n'etaient pas traités et surtout que j'utilisais mal les parentheses et crochets. N'ayant vu ton poste qu'apres mes modifs, j'ai donc corrigé avec cette expression (bien moins propre que la tienne) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    private static final String expressionReguliere = "([0-9]+|([0-9]+\\.\\.[0-9]+))(,[0-9]+|,([0-9]+\\.\\.[0-9]+))*";
    Les quelques tests que j'ai effectué m'ont semblé satisfaisant! Dans ton expression le ^ et le $ en debut et fin de chaine sont t'ils obligatoires ?
    Ces deux caractères te permettes de t'assurer qu'il n'y a rien avant ou après dans ta chaine. Tu ne perds donc rien.

  10. #10
    Membre Expert
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    1 252
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 252
    Par défaut
    Citation Envoyé par bouliz Voir le message
    j'ai donc corrigé avec cette expression (bien moins propre que la tienne) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    private static final String expressionReguliere = "([0-9]+|([0-9]+\\.\\.[0-9]+))(,[0-9]+|,([0-9]+\\.\\.[0-9]+))*";
    Hormis les caractères ^ et $, ton expression produit le même DFA que la mienne. Même la mienne a un nombre optimisé (optimum ?) de caractères, le principal est que tu comprennes l'expression et que tu saches l'expliquer à ceux qui liront ton code.

    D'ailleurs, mon expression n'est pas très propre, puisque pas du tout commentée ^^

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 05/05/2012, 15h42
  2. SHELL : Parser une chaine de caractere
    Par dib52002 dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 10/12/2010, 10h28
  3. parser des chaines de caracteres
    Par dlecteur dans le forum C
    Réponses: 10
    Dernier message: 06/02/2010, 10h53
  4. Decouper (parser) une chaine de caractere
    Par tletelli dans le forum Général Python
    Réponses: 2
    Dernier message: 03/06/2008, 09h34
  5. Probleme sur les chaines de caractere
    Par scorpiwolf dans le forum C
    Réponses: 8
    Dernier message: 06/05/2002, 19h01

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