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 :

Découpage d'une chaine de caractères


Sujet :

Java

  1. #1
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    87
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 32
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2011
    Messages : 87
    Points : 49
    Points
    49
    Par défaut Découpage d'une chaine de caractères
    Bonjour !

    J'aimerais pouvoir séparer une chaine de caractère de la manière suivante :
    soit une chaine de caractère du type "nom = bouh" ou "poids > 5" etc.
    j'aimerais découper cette chaine en trois valeurs :
    "nom" + "=" + "bouh" par exemple.
    Pour l'instant je sais faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    stok = new StringTokenizer(selection,"="); 
    sel = new String[stok.countTokens()] ; 
    i = 0;
    while ( stok.hasMoreTokens() ){ 
      sel[i] = stok.nextToken();
      i++;
    }
    Le problème est donc que :
    1. je n'ai que "=" or je voudrais pouvoir avoir les valeurs "=" ">" "<" etc. sans avoir besoin de créer x stringTokenizer
    2. Je voudrais pouvoir enregistrer l'élément de séparation utilisé (les "=", etc)

    Est ce qu'une fonction le permet ?

    Merci et bonne journée !

    Cordialement,

    Misaki43

  2. #2
    Membre chevronné
    Avatar de la.lune
    Homme Profil pro
    Directeur Technique
    Inscrit en
    Décembre 2010
    Messages
    545
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Comores

    Informations professionnelles :
    Activité : Directeur Technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2010
    Messages : 545
    Points : 2 084
    Points
    2 084
    Par défaut
    Si tu es sûr qu'il y a de l'espace entre ta chaîne de caractère alors ton séparateur c'est cet espace car tu veux que le signe = soit inclut sur le tableau généré, mais si tu connais déjà le signe séparateur pourquoi tu veux avoir trois termes. Moi je te conseil d'utiliser la méthode split qui est simple à manipuler

    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
     
     
    String tabStr[]="nom = bouh".split(" ");
    //Il faut s'assurer qu'il y a de l'espace
    //Tu peux les afficher
    for(String chaine: tabStr) {//cette instruction pour JAVA 5 et plus
    System.out.println(chaine) 
    } 
     
    /*Cette instruction t'affichera:
     
    nom
    =
    bouh
     
      */
    Avec cette petite instruction tu as tabStr[0]="nom" tabStr[1]="=" tabStr[2]="bouh"


    Par contre si tu veux "=" pour séparateur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    String tabStr[]="nom=bouh".split("=");
    Là tu as tabStr[0]="nom" tabStr[1]="bouh"
    Par contre ici pour garder que les mots assures toi qu'il n y a pas dutout de l'espace entre les mot sinon tu aura ces espaces sur les mot, a moin que tu intègre tes espaces dans le séparateur comme ça split(" = ");

  3. #3
    Rédacteur
    Avatar de CyberChouan
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    2 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Janvier 2007
    Messages : 2 752
    Points : 4 314
    Points
    4 314
    Par défaut
    Tu peux renseigner une liste de séparateurs de la manière suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String[] s = "first=second>third".split("[>=]");
    Tu auras en résultat 3 chaînes "first", "second", et "third" (mais tu perds les séparateurs).

    Pour la syntaxe "[>=]", c'est une expression régulière. Il y a des tutoriels à ce sujet dans les cours du site.

    C'est probablement ce qui répondra à ton besoin. En utilisant une expression plus complexe (avec des "groupes de capture"), tu pourras récupérer en un seul code les différents morceaux de chaîne qui t'intéressent.

    Voilà l'exemple que tu donnes. Dans le "pattern", les 3 groupes de parenthèses servent à récupérer respectivement la première partie de la chaîne, le séparateur ('>' ou '=') et la deuxième partie de la chaîne. Ces 3 éléments sont récupérés par le "matcher" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    String s = "first>second"
    Pattern p = Pattern.compile("(.+)([>=])(.+)");
    Matcher m = p.matcher(s);
    if (m.matches()) {
      String debut = m.group(1);
      String separateur = m.group(2);
      String fin = m.group(3);
    }

  4. #4
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    87
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 32
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2011
    Messages : 87
    Points : 49
    Points
    49
    Par défaut
    Bonjour et merci pour vos réponses précises !

    @la.lune : Non je ne peux pas être sure qu'il y ait des espace, d'ailleurs une opération que j'ai effectué avant est d'enlever les espaces donc ça ne pourrait pas marcher, mais ce qu'à donné Cyberchouan correspond à ce dont j'ai besoin

    @Cyberchouan : ah merci, c'est bien ce dont j'avais besoin (le matcher)! Maintenant je vais être plus précise encore sur mon problème : mon but est de séparer des champs sql en fait de conditions de sélection :
    du coup je n'ai pas que des caractères de comparaisons ('<', '=', '>') mais aussi des chaines de caractères ("like", "<>", "between" etc).
    Du coup y a t'il moyen d'avoir des séparateurs en "chaines de caractères" ?

  5. #5
    Membre chevronné
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    1 348
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 348
    Points : 1 787
    Points
    1 787
    Par défaut
    Le tout est de comprendre ce que CyberChouan t'a donné.
    Cela se base sur un Pattern qui est une expression régulière.
    Les () permettent de "retenir" ce qui a été matché.

    Donc quand on écrit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Pattern.compile("(.+)([>=])(.+)")
    cela veut dire qu'on va matcher un premier groupe qui contient n'importe quelle suite de caractères, un deuxième groupe qui contient un caractère parmi les caractères > et =, et un troisième groupe qui contient n'importe quelle suite de caractères.
    Pour prendre aussi le mot between, on pourrait par exemple faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Pattern.compile("(.+)([>=]|between)(.+)")
    Voir http://www.vogella.com/articles/Java...s/article.html pour plus d'infos sur les expressions régulières.

    Attention cependant, si tu veux vraiment "découper" une instruction sql, c'est un peu plus compliqué que simplement faire du découpage de chaîne de caractère sur séparateur. Réfléchis par exemple à l'exemple de requête suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT * FROM MyTable WHERE description like '%between%'

  6. #6
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    87
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 32
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2011
    Messages : 87
    Points : 49
    Points
    49
    Par défaut
    ah merci, je ne savais pas comment ça marchait cette fois j'ai exactement ce que je veux

    Tu me mâches le travail en me donnant ce problème de "%between%" : merci j'y avais pas du tout pensé !

    EDIT : Je me suis renseignée pour ce probleme et j'ai utilisé l'argument "limit" que l'on peut mettre dedans :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Pattern pat = Pattern.compile("(.+)([>=]|between|like|<>)(.+)", 3);
    Le probleme est que pour une ligne du type : type=table=test
    J'obtiens : "type=table" "=" "test" donc ça marche pas dans le bon sens...

  7. #7
    Membre chevronné
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    1 348
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 348
    Points : 1 787
    Points
    1 787
    Par défaut
    Il faut voir quelle est la chaîne que tu veux découper ... Faire un analyseur SQL qui marche dans tous les cas n'est pas des plus simple.
    Si tu veux uniquement pouvoir parser la partie WHERE d'une requête SQL, l'idée de "cases" fonctionne à condition de supposer que tu n'as pas de champs dans ta base qui soit nommé de façon tordue.
    Par exemple, il est tout à fait possible de créer un champ dans une table User qui s'appelle "average time between logins". Je te l'accorde, c'est moisi et tordu, mais c'est malheureusement possible.

    Ce que tu veux faire, c'est dans le cadre d'un exercice ? Ou c'est pour une vraie application ?

  8. #8
    Membre chevronné
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    1 348
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 348
    Points : 1 787
    Points
    1 787
    Par défaut
    Si tu veux que ton expression régulière coupe "le plus tôt possible", il faut qu'elle soit non greedy, c'est à dire que tu souhaites que le premier .+ matche le moins de caractères possible. Pour cela, il faut lui ajouter un ?
    Tu obtiendras donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Pattern pat = Pattern.compile("(.+?)([>=]|between|like|<>)(.+)", 3);
    Ca résout le problème de between ou like dans la valeur de droite, mais pas le cas où tu aurais between ou like dans le nom du champ

  9. #9
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    87
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 32
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2011
    Messages : 87
    Points : 49
    Points
    49
    Par défaut
    Ah oui j'ai trouvé un tutoriel parlant de ce "?" mais je ne comprenais pas comment ça marchait, merci encore une fois c'est exactement ce que je voulais. par contre, au final le "3" que j'ai mis sert à rien il me semble, non ? J'avais mélangé avec "split" ça m'étonne même qu'il compile avec (dans la javadoc il ne parle même pas de "limit" ici).

    Pour le problème des requêtes incompréhensible... je pense que normalement il n'y aura pas de truc aussi tordu...
    Mais il y a moyen pour moi de résoudre ce problème (en effet la partie de gauche de la comparaison correspond à un "ensemble" qui est enregistré quelque part dans un tableau de chaine de caractère).
    Cependant c'est compliqué dans un premier temps, je pense que je vais supposer qu'il n'y aura pas de requêtes aussi tordu

    Et bien cette application est à faire pour un projet de classe ce qui correspond quand même pour moi à une "vrai application" le mieux serait quand même qu'elle soit pertinente...
    En tout cas je vais chercher la solution par moi même concernant ce problème.

    Merci en tout cas problème résolu par votre dernier message !

  10. #10
    Membre chevronné
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    1 348
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 348
    Points : 1 787
    Points
    1 787
    Par défaut
    Effectivement, le 3 n'est pas bon ici. Je n'avais pas regardé, mais quand tu passes un entier à Pattern.compile c'est pour indiquer le comportement.
    On appelle ça des flags, et ça permet de dire si tu veux matcher sur du multiligne, si tu veux du case insensitive etc ...
    Donc hors sujet en ce qui te concerne et à enlever.

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 21/11/2013, 21h29
  2. Découpage d'une chaine de caractère
    Par malus56 dans le forum Débuter
    Réponses: 10
    Dernier message: 01/08/2011, 09h22
  3. Découpage d'une chaine de caractères
    Par geofnich dans le forum SAS Base
    Réponses: 5
    Dernier message: 06/05/2010, 12h28
  4. Découpage d'une chaine de caractères
    Par fab3131 dans le forum MFC
    Réponses: 2
    Dernier message: 08/04/2006, 17h46
  5. découpage d'une chaine de caractère
    Par lamojuli dans le forum ASP
    Réponses: 4
    Dernier message: 13/05/2004, 16h00

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