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

Langage Java Discussion :

Limites de la classe Scanner


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    139
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 139
    Par défaut Limites de la classe Scanner
    Salut à tous,

    précédemment dans un autre post :

    http://www.developpez.net/forums/sho...d.php?t=159353

    je cherchais à résoudre un problème avec StringTokenizer, le problème ayant été plus compliqué que je ne le pensais, j'ai cherché une autre solution. En effet, mon besoin ne se limitait pas à un ou deux marqueur dans une même chaîne mais à un N...

    La classe Scanner a donc résolu une partie de mon problème en revanche, cette classe ne prends apparement pas en compte certains caractères spéciaux. J'appuis cette conclusion par 2 exemples :


    Pour tous les exemples, le code source est identique, seules les chaînes à traiter diffèrent...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    String l_readLine = "<BALISE> 1324 mot1: 8 mots separes par des espaces"; 
     
    System.out.println("traitement de : ["+l_readLine+"]\n\n(--> chaine entre [...])\n");
     
    Scanner s = new Scanner(l_readLine);
     
    s.findInLine("<BALISE> (\\d+) (\\w+): (\\d+) ([\\w\\s]*)");
    MatchResult result = s.match();
    for (int i=1; i<=result.groupCount(); i++)
            System.out.println(result.group(i)+" ");
    s.close();
    1) exemple qui fonctionne, j'extrais d'une chaine un nombre, une chaine, un mot :

    traitement de : [<BALISE> 1324 mot1: 8 mots separes par des espaces]

    (--> chaine entre [...])

    1324
    mot1
    8
    mots separes par des espaces
    2) même exemple avec des accents, j'extrais d'une chaine un nombre, une chaine, un mot :

    traitement de : [<BALISE> 1324 mot1: 8 mots séparés par des espaces]

    (--> chaine entre [...])

    1324
    mot1
    8
    mots s
    S'il n'y avait que les accents bon encore... (ennuyeux mais bon, il y a probablement un moyen de contrer ca...) en revanche ce qui est moins drôle :

    3) exemple avec un caractère spécial : "+"


    traitement de : [<BALISE> 1324 mot1: 8 mots+mots]

    (--> chaine entre [...])

    1324
    mot1
    8
    mots

  2. #2
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,


    Ce comportement est normal puisque ton pattern est trop restrictifs : \w\s signifie : [a-zA-Z_0-9]|[ \t\n\x0B\f\r]

    Il n'accepte donc pas les caractères accentuées ni les signes de ponctuations ou autres...

    Il te faut donc utilise \p{L} qui représentent toutes les lettres, et \p{Punct} qui représente la ponctuation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    s.findInLine("<BALISE> (\\d+) (\\w+): (\\d+) ([\\p{L}\\p{Punct}\\s]*)");
    Plus d'info : Pattern

    Sinon tu peux carrément utilisé .* pour récupérer tout le reste de la chaine...

    a++

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    139
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 139
    Par défaut
    salut à tous,

    encore un petit souci avec ces @^$¤ de chaînes de caractères à traiter ...

    J'essai de trancher (désolé du terme mais j'ai envi de la trancher là lol) une chaine de caractere du type :

    1 "val desc1" 2 "val desc2" 3 "val desc3"
    NB : le nombre de paramètres est inconnu à l'avance

    problème... dès que des accents apparaissent, je pense que c'est le problème et bien ca plante en regardant l'expression régulière on voit que les accents ne sont pas gérés ... mais comment les gérer alors ??

    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
    16
    		Matcher m = p.matcher(l_readLine); // Create Matcher
     
    		String m_strTmp = null ;
     
    		while (m.find()) 
                    {
    		    s = new Scanner(m.group());
                        s.findInLine("(\\d+) \"([\\w\\s]*)\"");
    		    result = s.match();
     
                        for (int i=1; i<=result.groupCount(); i+=2)
    		    {
                               System.out.println("couple val-description"+i+" : "+(String)result.group(i))+",'"+result.group(i+1) ;
                        }
                    }
    		s.close();

  4. #4
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par WuKoDLaK
    problème... dès que des accents apparaissent, je pense que c'est le problème et bien ca plante en regardant l'expression régulière on voit que les accents ne sont pas gérés ... mais comment les gérer alors ??
    As-tu lu mon message ????

    a++

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    139
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 139
    Par défaut
    oép oép

    entre temps j'ai trouvé la solution au problème, j'ai confirmé que ct la restriction sur le regex

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

Discussions similaires

  1. methode de la classe Scanner()
    Par biloute555 dans le forum Langage
    Réponses: 2
    Dernier message: 27/03/2008, 13h48
  2. Utilisation de la classe Scanner sous Eclipse
    Par cadabricadabra dans le forum Eclipse Java
    Réponses: 3
    Dernier message: 24/02/2008, 12h30
  3. La Classe Scanner
    Par amazircool dans le forum Langage
    Réponses: 2
    Dernier message: 22/04/2007, 19h50
  4. Utilisation de la classe Scanner
    Par habasque dans le forum Langage
    Réponses: 4
    Dernier message: 26/01/2007, 16h38
  5. Utilisation de la classe Scanner sous Eclipse
    Par cadabricadabra dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 04/10/2006, 16h48

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