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 :

split d'un String/expression reguliere


Sujet :

Collection et Stream Java

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 19
    Par défaut split d'un String/expression reguliere
    Bonjour a tous ,

    Voila je vous expose mon probleme : je cherche a decouper un String (en Java) d'une certaine maniere seulement je n'ai pas reussi a trouver une l'expression reguliere correspondante. Un petit exemple sera plus parlant :

    Je veux decouper ce String :
    Voici la "chaine que je veux " decouper et j'y [arrive pas]
    En fait, j'aimerais, a l'aide de la methode String.split(expression) pouvoir decouper cette chaine comme ceci :
    Voici la
    "chaine que je veux"
    decouper et j'y
    [arrive pas]

    En gros, je veux decouper la chaine a partir des espaces quie ne sont pas contenus dans les guillemets, ni dans les crochets. J'ai pas mal lutte et j'ai toujours pas reussi a trouver d'expressions qui marchent (a dire vrai je ne sais pas si il y en a). J'ai aussi penser a faire plusieurs split() successifs (genre 1 pour les guillemets, puis un pour les crochets et un pour les espaces) mais bon je me suis dit ca fait un peu trop a l'arrache :p
    Donc voila j'espere que quelqu'un saura trouver la reponse (positive ou negative), ou bien me proposer une autre solution, parce que sinon ca sent les split() successifs :p

    Merci bien

  2. #2
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (([^"\[\]\s]*))|(\[([^]]*)\])|(\"([^"]*)\")
    Quelque chose comme çà devrait servir de point de départ. Ca devrit lire (sauf si m'est gourré, l'est tard)

    ( ( tout sauf crochet guillement espace ) )
    ou ( crochet (tout sauf crochet ) crochet )
    ou ( guillemet (tout sauf guillemet) guillement )

    Ensuite, t'as plus qu'a jouer avec le matcher et le nextMatch() (et oui, pas de simple split là) dont tu extrait le deuxième groupe (paranthèse imbriquée du ou qui a matché)

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 19
    Par défaut
    ok je te remercie, je vais test ca et puis je te dirais

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 19
    Par défaut
    Bon voila en fait j'ai pas trouve de methode nextMatch() pour la classe Matcher, mais j'ai utiliser la methode find() (je ne sais pas si c'est celle ci dont tu parlais)
    Voici le code :

    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
    17
    18
    19
    20
     
    public class Def {
     
    	private final String s = "(([^\"\\[\\]\\s]*))|(\\[([^\\]]*)\\])|(\\\"([^\"]*)\\\")";
     
    	public static void main(String[] args) {
    		Def d = new Def("Voici la \"chaine que je veux \" decouper et j'y [arrive pas]  ");
    	}
     
    	public Def(String aString){
    		Pattern p = Pattern.compile(s);
    		Matcher m = p.matcher(aString);
    		Vector<String> tmp = new Vector<String>();
    		while(m.find()){
    			tmp.add(aString.substring(m.start(), m.end()));
    		}
                    //petit affichage pour verifier les valeurs du Vector
    		for(int i=0;i<tmp.size();i++)
    			System.out.println(tmp.elementAt(i));
    	}
    et puis le resultat de l'affichage

    Voici

    la


    chaine

    que

    je

    veux



    decouper

    et

    j'y


    arrive

    pas


    Bon comme tu peux le voir, cela ne fonctionne pas. Pourtant ton expression reguliere me parait correct (enfin je ne suis pas une reference en la matiere), alors je fais peut etre un mauvais usage du Matcher (jamais utliser avant). Donc voila si tu pouvais m'eclairer ?

    Merci

  5. #5
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    je pensais plutot à un while (m.find()) list.add(m.group(1));

  6. #6
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    code correct:
    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
    17
    18
    19
    20
    public class Def {
     
            private final String s = "\\s*((([^\"\\[\\]\\s]+))|(\\[([^\\]]+)\\])|(\\\"([^\"]+)\\\"))\\s*";
     
            public static void main(String[] args) {
                    Def d = new Def("Voici la \"chaine que je veux \" decouper et j'y [arrive pas]  ");
            }
     
            public Def(String aString){
                    Pattern p = Pattern.compile(s);
                    Matcher m = p.matcher(aString);
                    Vector<String> tmp = new Vector<String>();
                    while(m.find()){
                            tmp.add(m.group(1));
                    }
                    //petit affichage pour verifier les valeurs du Vector
                    for(int i=0;i<tmp.size();i++)
                            System.out.println(tmp.elementAt(i));
            }
     }
    J'avais mis des * plutot que des +, ce qui fait que le premier élement matchait toujours

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 19
    Par défaut
    Super ca marche nickel, merci beaucoup tchize, ca m'enleve une sacre epine du pied.

    Probleme resolu!!

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

Discussions similaires

  1. String et expression reguliere
    Par flipper203 dans le forum Collection et Stream
    Réponses: 6
    Dernier message: 19/08/2006, 10h00
  2. [String] Expression régulière split
    Par kalos dans le forum Collection et Stream
    Réponses: 2
    Dernier message: 20/02/2006, 16h09
  3. [String] Expression régulière et caractères spéciaux
    Par Johnbob dans le forum Collection et Stream
    Réponses: 5
    Dernier message: 13/01/2006, 18h27
  4. [String] Expression régulière
    Par jh0483 dans le forum Collection et Stream
    Réponses: 11
    Dernier message: 13/01/2006, 17h38
  5. [String] rendre une expression reguliere insensible à la case
    Par chimical dans le forum Collection et Stream
    Réponses: 4
    Dernier message: 07/05/2004, 11h38

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