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 :

Découpage de chaine avec conservation des séparateurs


Sujet :

Collection et Stream Java

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 8
    Points : 6
    Points
    6
    Par défaut Découpage de chaine avec conservation des séparateurs
    Bonjour à tous,

    voilà j'ai besoin de couper une chaîne en plusieurs morceaux mais en conservant le séparateur dans les morceaux.

    exemple :

    ma chaîne : "soit {nomVariable} étant un {Objet}"
    résultat attendu : ["soit ", "{nomVariable}"," étant un ","{Objet}"]
    les séparateurs étant les crochets {}.

    J'ai essayé plusieurs solutions (split, StringTokenizer ...) mais je n'arrive qu'à avoir ["soit ", "nomVariable"," étant un ","Objet"]

    Quelqu'un aurait-il une idée ?

    Merci d'avance,

    Vincent

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    282
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 282
    Points : 327
    Points
    327
    Par défaut
    Il suffit de se faire ta propre méthode de séparation en utilisant indexOf('{') et indexOf('}').

    Tu recherche le '{', si tu le trouves tu cherches le '}' le plus proche, tu fais un substring et tu recommences pour la suite de la chaine.

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 8
    Points : 6
    Points
    6
    Par défaut
    Salut,

    c'est ce que je voulais éviter mais si aucune méthode dans la jdk 1.5 ne le permet c'est ce que je vais faire.

    merci,

    Vincent

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    282
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 282
    Points : 327
    Points
    327
    Par défaut
    tu peux utiliser les expressions régulières sinon mais je ne les maîtrise pas assez pour trouver la solution ... je te file quand même le bout de code que je viens de tester :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    String chaine = "ceci {variable} est ma {variable2} chaine";
    List res = findVars(chaine);
    System.out.println(res);
    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
     
    @SuppressWarnings("unchecked")
    public static List findVars(String input) {
    		Pattern p = Pattern.compile("\\{.*\\}");
    		Matcher m = p.matcher(input);
    		List list = new ArrayList();
    		if (m.find()) {
    			do {
    				list.add(m.group());
     
    			} while (m.find());
    			return list;
    		}
    		return null;
    }
    qui pour le moment renvoit :
    [{variable} est ma {variable2}]
    Il faut donc trouver la regex qui défini "commencer par { et se termine par le premier } trouvé"

  5. #5
    Expert éminent
    Avatar de djo.mos
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    4 666
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 4 666
    Points : 7 679
    Points
    7 679
    Par défaut
    Bonjour.
    C'est pas la solution du problème en question, mais juste pour info:
    le "*" des RegExp est par défaut "gourmand" (greedy), càd que "{.*} dans une chaine comme "{variable} est ma {variable2}" va matcher toute cette chaine, y compris le premier "}" rencontré.
    OPn peut rémedier à cela en ajoutant "?" après le *, ce qui donne {.*?} ce qui permettre de s'arreter dès le premier "}" trouvé.

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    282
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 282
    Points : 327
    Points
    327
    Par défaut
    Merci djo.mos, ça me sera utile à moi aussi et même si ce n'est pas la solution du problème, avec l'utilisation des Patterns et ta note, il devrait pouvoir s'en sortir sans trop de problèmes

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 8
    Points : 6
    Points
    6
    Par défaut
    Merci, mais je n'arrive toujours pas à répondre à ma question avec les regex car je veux qu'il me retourne la liste :
    "ceci ", "{variable}", " est ma ", "{variable2}", " chaine";
    et pas uniquement les données entre crochets.

    J'ai donc utilisé des substrings et indexOf, ce qui donne une méthode assez moche :

    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
    21
    22
    23
     
    	private List<String> splitWithDelimiters(String str, String openLimit, String closeLimit)
    	{
    		List<String> list = new ArrayList<String>();
    		int firstOpenLimit = str.indexOf(openLimit);
    		int firstCloseLimit = str.indexOf(closeLimit, firstOpenLimit);
    		while ((firstOpenLimit != -1) && (firstCloseLimit != -1))
    		{
    			if (firstOpenLimit > 0)
    				list.add(str.substring(0, firstOpenLimit));
    			list.add(str.substring(firstOpenLimit,firstCloseLimit + 1));
     
    			if (firstCloseLimit < str.length())
    				str = str.substring(firstCloseLimit + 1, str.length());
    			else
    				str = "";
    			firstOpenLimit = str.indexOf(openLimit);
    			firstCloseLimit = str.indexOf(closeLimit, firstOpenLimit);			
    		}
    		if (str.length() > 0)
    			list.add(str);
    		return list;
    	}
    ce qui donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    String chaine = "ceci {variable} est ma {variable2} chaine";
    List<String> strings = splitWithDelimiters(chaine, "}", "{");
    System.out.println(strings)
    ["ceci ", "{variable}", " est ma ", "{variable2}", " chaine"]
    en tout cas, merci pour les conseils de regex qui j'utiliserai dans d'autres cas.

    Vincent

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    572
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Février 2007
    Messages : 572
    Points : 675
    Points
    675
    Par défaut
    Voila une solution avec les regex, si tu veux

    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
    List<String> split(String string) {
            ArrayList<String> strings = new ArrayList<String>();
     
    	Pattern pattern = Pattern.compile("\\{(.*?)\\}");
    	Matcher matcher = pattern.matcher(string);
     
    	int last = 0;
    	while (matcher.find()) {
    	  strings.add(string.substring(last, matcher.start()));
              strings.add(matcher.group());			
    	  last = matcher.end();
    	}
    	if (last!=string.length())
    	  strings.add(string.substring(last, string.length()));
     
             return strings;
    }

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

Discussions similaires

  1. Remplacer les blocks avec conservations des paramètres
    Par yamin69 dans le forum Simulink
    Réponses: 2
    Dernier message: 22/04/2013, 13h43
  2. Réponses: 5
    Dernier message: 06/07/2011, 00h50
  3. Découper une chaine séparée par des séparateur ;
    Par d.tellier dans le forum MS SQL Server
    Réponses: 9
    Dernier message: 23/12/2010, 18h21
  4. [JDOM] Suppression de noeud avec conservation des fils
    Par Carabi dans le forum Format d'échange (XML, JSON...)
    Réponses: 7
    Dernier message: 16/03/2009, 21h14
  5. [VB.NET] Compléter une chaine avec des espaces
    Par Lois dans le forum Windows Forms
    Réponses: 4
    Dernier message: 24/03/2005, 09h09

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