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 :

Une boucle pour x répétitions


Sujet :

Langage Java

  1. #1
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mai 2014
    Messages : 180
    Par défaut Une boucle pour x répétitions
    Hello
    alors j'ai un petit problème au niveau de la condition sur ma boucle pour faire une répétition.
    alors voila mes données :

    ici mon texte :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
     "#----------------------------------------------------------------------\n" +
            "#"+
    		"# Variables\n" +
    		"#----------------------------------------------------------------------\n" +
    		"#> hello\n" +
    		"d= \"{poli}_{gtr}_sylda_{BMW}\"\n" +
    		"x = \"{kiko}/{poli}/script/{poli}_{gtr}_sylda_{BMW}/{conf_cu}/{AUDI}/{RN}/SS\"\n" +
    		"y = \"{kiko}/{poli}/script/{poli}_{gtr}_sylda_{BMW}/{conf_cu}/{AUDI}/{RN}/EE\"\n" +
    		"u = \"{kiko}/{poli}/script/{poli}_{gtr}_sylda_{BMW}/{conf_cu}/{AUDI}/{RN}/GT\"\n" +
    		"u'  = \"{kiko}/{poli}/script/{poli}_{gtr}_sylda_{BMW}/{conf_cu}/{AUDI}/{RN}/UG\"\n" +
    		 "#< end \n" +
    		"z=  caln" +
    		"#----------------------------------------------------------------------\n";
    ici mon fichier xml :

    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
    <?xml version="1.0" encoding="utf-8"?>
    <parametters>
    	<value name ="poli">
    		"nono"
    	</value>
    	<value name ="gtr">
    		"pupupu"
    	</value>
    	<value name ="BMW">
    		"nounou"
    	</value>
    	<value name ="AUDI">
    		"m3"
    	</value>
    	<value name ="RN">
    		"Rs6"
    	</value>
    </parametters>
    et en faite j'ai fais un code qui permet de remplacer la clé par sa valeur c'est a dire par exemple "poli" sera remplacer dans le texte par "nono".

    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
     
    public class Mopl {
     
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
     
    		 final String ZONE_B = "#>";
    		  final String ZONE_E = "#<";
    		  final String VALUE_B = "{";
    		  final String VALUE_E = "}";
     
     
     
    		String texte = "#----------------------------------------------------------------------\n" +
            "#"+
    		"# Variables\n" +
    		"#----------------------------------------------------------------------\n" +
    		"#> hello\n" +
    		"d= \"{poli}_{gtr}_sylda_{BMW}\"\n" +
    		"x = \"{kiko}/{poli}/script/{poli}_{gtr}_sylda_{BMW}/{conf_cu}/{AUDI}/{RN}/SS\"\n" +
    		"y = \"{kiko}/{poli}/script/{poli}_{gtr}_sylda_{BMW}/{conf_cu}/{AUDI}/{RN}/EE\"\n" +
    		"u = \"{kiko}/{poli}/script/{poli}_{gtr}_sylda_{BMW}/{conf_cu}/{AUDI}/{RN}/GT\"\n" +
    		"u'  = \"{kiko}/{poli}/script/{poli}_{gtr}_sylda_{BMW}/{conf_cu}/{AUDI}/{RN}/UG\"\n" +
    		 "#< end \n" +
    		"z=  caln" +
    		"#----------------------------------------------------------------------\n";
     
    		int ao = 0;
    		int po = 0;
     
    //		while(ao >= 0 && po >= 0){
     
    		// Pour avoir les positions { et } 
    		ao = texte.indexOf(VALUE_B,po);
    		po = texte.indexOf(VALUE_E,ao);
    		//System.out.println("position 1 : " +ao);
    		//System.out.println("position 2 : " + po);
     
    		// ce qu'il y a entre { }
    		String a = texte.substring(ao+1, po);
    		//System.out.println(a);
     
    		// Ce qu'il y a avant {etude}
    		String b = texte.substring(0, ao-1);
    		//System.out.println(b);
     
    		// Ce qu'il y a après {etude}
    		String c = texte.substring(po+1,texte.length());
    		//System.out.println(c);
     
    		// On fais appel à la classe Classement
    		Classement cl = new Classement("C:\\Users\\ksmaili\\workspace\\voiture.xml"); 
    		//System.out.println(cl.getValueByKey(a)); // appel de la méthode getValueByKey
     
     
    	System.out.println(b.concat(cl.getValueByKey(a).concat(c)));
    		}
    //	}
     
    }
    En faite en sorti j'ai réussi a remplacer "nono" par "poli" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #----------------------------------------------------------------------
    ## Variables
    #----------------------------------------------------------------------
    #> hello
    d= "nono"_{gtr}_sylda_{BMW}"
    x = "{kiko}/{poli}/script/{poli}_{gtr}_sylda_{BMW}/{conf_cu}/{AUDI}/{RN}/SS"
    y = "{kiko}/{poli}/script/{poli}_{gtr}_sylda_{BMW}/{conf_cu}/{AUDI}/{RN}/EE"
    u = "{kiko}/{poli}/script/{poli}_{gtr}_sylda_{BMW}/{conf_cu}/{AUDI}/{RN}/GT"
    u'  = "{kiko}/{poli}/script/{poli}_{gtr}_sylda_{BMW}/{conf_cu}/{AUDI}/{RN}/UG"
    #< end 
    z=  caln#----------------------------------------------------------------------
    mais je dois boucler pour le reste !!! comment puis-je faire ? avez vous une petite astuce ?

    boucle while ou for ??

  2. #2
    Membre Expert
    Avatar de eulbobo
    Homme Profil pro
    Développeur Java
    Inscrit en
    Novembre 2003
    Messages
    786
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Novembre 2003
    Messages : 786
    Par défaut
    Donc en gros
    - tu as un texte avec des "zones" qui contiendront des variables (une sorte de template)
    - tu as un fichier xml contenant les correspondance clé/valeur
    - tu veux faire le remplacement de toutes les clé de type {ma clé} par la valeur correspondante

    Si c'est ça, je pense que le plus simple serait de regarder vers les expressions régulières :
    Tu charges ton fichier contenant les associations clés/valeur
    Tu charges ton fichier texte
    Pour chaque clé, tu fais un remplacement avec une expression régulière :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    String myText = ... // chargement du texte
       for (<boucle sur tes éléments clé/valeur>){
          myText = myText.remplaceAll("{" + key + "}", value);
       }

    (attention, ce code est gourmand en terme de ressource et de mémoire, mais il a l'avantage d'être court !)


    Après j'ai deux questions :
    - si ton fichier XML n'est qu'une liste d'association clé/valeur, pourquoi ne pas utiliser les Properties ou même un RessourceBundle ?
    - il va servir à quoi le fichier texte final avec les valeurs remplacées?




    Tu pourrais ensuite faire plus efficace en commençant par parcourir ton texte avec une expression régulière recherchant tout ce qui se présente sous la forme "{clé alphanumérique}", récupérer les clés, puis pour chaque clé faire la modification.
    Le pattern de recherche à utiliser est le suivant : "\\{(\\w+)\\}", et ensuite récupérer la valeur de groupe 1, ce qui donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    		String myText = ...// chargement de ton texte
    		Pattern pat = Pattern.compile( "\\{(\\w+)\\}");
    		Matcher m = pat.matcher(myText );
    		Set<String> keys = new HashSet<String>();
     
    		while (m.find()){ // recherche de toutes les clés
    			keys.add(m.group(1));
    		}
     
    		for (String key : keys){ // remplacement des clés
    		      myText = myText.remplaceAll("{" + key + "}", cl.getValueByKey(key));
    		}

  3. #3
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mai 2014
    Messages : 180
    Par défaut
    Yoh

    oui j'ai :

    - un texte avec des "zones" qui contiendront les valeurs des clés( exemple : pupupu ( la valeur )a la place de gtr ( qui est la clé )
    - un fichier xml contenant les correspondance clé/valeur
    - Je veux faire le remplacement de toutes les clé de type {ma clé} par la valeur correspondante

    - si ton fichier XML n'est qu'une liste d'association clé/valeur, pourquoi ne pas utiliser les Properties ou même un RessourceBundle ?
    Je ne connaîs pas je suis débutant en JAVA
    - il va servir à quoi le fichier texte final avec les valeurs remplacées?
    C'est une petite partie d'un projet que je fais en tant que stagiaire en faite.

    sinon pour le code j'ai sa mais le i je le met en attribut par rapport a quoi ??

    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
     
     
    		  final String ZONE_B = "#>";
    		  final String ZONE_E = "#<";
    		  final String VALUE_B = "{";
    		  final String VALUE_E = "}";
     
    		String texte =  
    				 "#----------------------------------------------------------------------\n" +
    					        "#"+
    							"# Variables\n" +
    							"#----------------------------------------------------------------------\n" +
    							"#> hello\n" +
    							"d= \"{poli}_{gtr}_sylda_{BMW}\"\n" +
    							"x = \"{kiko}/{poli}/script/{poli}_{gtr}_sylda_{BMW}/{conf_cu}/{AUDI}/{RN}/SS\"\n" +
    							"y = \"{kiko}/{poli}/script/{poli}_{gtr}_sylda_{BMW}/{conf_cu}/{AUDI}/{RN}/EE\"\n" +
    							"u = \"{kiko}/{poli}/script/{poli}_{gtr}_sylda_{BMW}/{conf_cu}/{AUDI}/{RN}/GT\"\n" +
    							"u'  = \"{kiko}/{poli}/script/{poli}_{gtr}_sylda_{BMW}/{conf_cu}/{AUDI}/{RN}/UG\"\n" +
    							 "#< end \n" +
    							"z=  caln" +
    							"#----------------------------------------------------------------------\n";
    		// On fais appel à la classe Classement
    		Classement cl = new Classement("C:\\Users\\ksmaili\\workspace\\voiture.xml"); 
    		System.out.println(cl.getValueByKey(a)); // appel de la méthode getValueByKey
     
     
    		for (i=0; i >=0 ; i++){
     
    			texte = texte.remplaceAll("{" + key + "}", value);
     
    		}

  4. #4
    Membre Expert
    Avatar de eulbobo
    Homme Profil pro
    Développeur Java
    Inscrit en
    Novembre 2003
    Messages
    786
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Novembre 2003
    Messages : 786
    Par défaut
    Citation Envoyé par khalous91 Voir le message
    Je ne connaîs pas je suis débutant en JAVA
    Tu devrais aller lire ce thread qui contient des solutions simples pour stocker des paires clés/valeurs avec des exemples : http://www.developpez.net/forums/d15...tres-d-classe/


    Pour ton code, actuellement, ça pourrait donner un truc comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    		Classement cl = new Classement("C:\\Users\\ksmaili\\workspace\\voiture.xml"); 
     
                    Pattern pat = Pattern.compile( "\\{(\\w+)\\}");
    		Matcher m = pat.matcher(myText );
    		Set<String> keys = new HashSet<String>();
     
    		while (m.find()){ // recherche de toutes les clés dans le texte
    			keys.add(m.group(1));
    		}
     
    		for (String key : keys){ // remplacement des clés
    		      texte = texte.remplaceAll("{" + key + "}", cl.getValueByKey(key));
    		}
    Sinon, tu fais en sorte que ta classe Classement implémente Iterable<String>, tu implémentes la méthode iterator() dans ta classe Classement pour qu'elle renvoie un itérateur sur les clés de ton fichier clé/valeur, et refais la boucle autrement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    		Classement cl = new Classement("C:\\Users\\ksmaili\\workspace\\voiture.xml"); 
     
    		for (String key : cl){ parcours de toutes les clés connues
    		      texte = texte.remplaceAll("{" + key + "}", cl.getValueByKey(key));// remplacement des clés
    		}
    L'avantage de la deuxième solution c'est que tu n'essayeras pas de convertir des clés qui ne sont pas dans ton fichier de correspondance

  5. #5
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mai 2014
    Messages : 180
    Par défaut
    D'accord
    merci pour les conseils
    sinon j'ai trouver ça et ça a l'air plus simple à comprendre mais plus long :

    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
     
    import java.util.HashMap;
     
    /**
     * Elle modifie tous les {keys} en {valeurs}
     * @author ksmaili
     *
     */
    public class Valeurkeys {
     
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
     
     
    		  final String ZONE_B = "#>";
    		  final String ZONE_E = "#<";
    		  final String VALUE_B = "{";
    		  final String VALUE_E = "}";
     
    		String texteRef = #----------------------------------------------------------------------
    ## Variables
    #----------------------------------------------------------------------
    #> hello
    d= "nono"_{gtr}_sylda_{BMW}"
    x = "{kiko}/{poli}/script/{poli}_{gtr}_sylda_{BMW}/{conf_cu}/{AUDI}/{RN}/SS"
    y = "{kiko}/{poli}/script/{poli}_{gtr}_sylda_{BMW}/{conf_cu}/{AUDI}/{RN}/EE"
    u = "{kiko}/{poli}/script/{poli}_{gtr}_sylda_{BMW}/{conf_cu}/{AUDI}/{RN}/GT"
    u'  = "{kiko}/{poli}/script/{poli}_{gtr}_sylda_{BMW}/{conf_cu}/{AUDI}/{RN}/UG"
    #< end 
    z=  caln#----------------------------------------------------------------------
     
     
    			int ao = 0;
    		 	int po = 0;
    		 	String texte = texteRef;
    			ao = texte.indexOf(VALUE_B,po);
    			po = texte.indexOf(VALUE_E,ao);
    			while(ao >= 0 && po >= 0){           
    				// Pour avoir les positions { et } 
     
    				System.out.println("position 1 : " +ao);
    				System.out.println("position 2 : " + po);
     
    				// ce qu'il y a entre { }
    				String a = texte.substring(ao+1, po);
    				System.out.println(a);
     
    				// Ce qu'il y a avant {etude}
    				String b = texte.substring(0, ao);
    				//System.out.println(b);
     
    				// Ce qu'il y a après {etude}
    				String c = texte.substring(po+1,texte.length());
    				//System.out.println(c);
     
    				// On fais appel à la classe Classement
    				Classement cl = new Classement("C:\\Users\\ksmaili\\workspace\\donnees.xml"); 
    				//System.out.println(cl.getValueByKey(a)); // appel de la méthode getValueByKey
     
     
    				//System.out.println(b.concat(cl.getValueByKey(a).concat(c)));
     
    				//System.out.println(cl.getValueByKey(a));
    				if (cl.getValueByKey(a) != null) {				
    					texte = b.concat(cl.getValueByKey(a).concat(c));
    				}
    				ao = texte.indexOf(VALUE_B,po);
    				po = texte.indexOf(VALUE_E,ao);
    			}
    		 	System.out.println(texte);
     
    	}
     
    }

  6. #6
    Membre Expert
    Avatar de eulbobo
    Homme Profil pro
    Développeur Java
    Inscrit en
    Novembre 2003
    Messages
    786
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Novembre 2003
    Messages : 786
    Par défaut
    Pour le côte "plus simple à comprendre", j'ai envie de répondre : "heu... non..."

    Ton algo :
    - tu prends a0 et p0
    - tu prends texte tu mets texteRef dedans
    - dans a0 tu mets l'index de B en commençant par p0 (donc 0... donc pourquoi le préciser?)
    - dans p0 tu mets l'index de E en commençant par a0 (ok, là ça a un sens...)
    - Tant que a0 et p0 sont >=0 tous les deux :
    -- Récupérer ce qu'il y a entre ao+1 et p0 et on le met dans a
    -- Récupérer ce qu'il y a avant a0 et on le met dans b
    -- Récupérer ce qu'il y a après p0 et on le met dans c
    -- Récupérer le tableau de correspondance clé/valeur (tu pourrais le sortir de ta boucle pour le pas le recharger à chaque fois, mais passons)
    -- S'il existe une valeur correspondant à la clé (a)
    ---- Tu remplaces la valeur de texte par la concaténation de B (le début) + la valeur correspondant à la clé + C (la fin)
    -- dans a0 tu mets l'index de B en commençant par p0
    -- dans p0 tu mets l'index de E en commençant par a0


    Mon algo 1 :
    - Tu récupères ton tableau de valeur
    - Tu crée une règle regexp de recherche de l'expression : "Toute chaîne alphanumérique entre {}"
    - Tant que tu trouves des clés
    -- Tu ajoutes les clés à une liste unique des clés dans le texte
    - Pour toute les clés trouvées
    -- tu remplaces la clé par la valeur dans le texte

    Mon algo 2 :
    - Tu récupères ton tableau de valeur
    - Pour chaque clé dans le tableau, tu remplaces la clé par la valeur dans le texte


    La simplicité d'un code tient en deux choses :
    - il est court
    - il ne réinvente pas ce qui existe déjà

    La remplacement de chaîne dans un texte, c'est le boulot du code existant à ta disposition dans l'API. Soit un feignant intelligent !

  7. #7
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mai 2014
    Messages : 180
    Par défaut
    Lol oui c'est vrai que c'est plus simple comme tu l'as fait, enfin c'est beaucoupl plus court!!
    Mais vu que je susi débutant j'aurai jamais pu trouver ça! ( je pense).

    sinon en ce qui concerne ton code 1 :
    j'ai essayer de compilé mais le compilateur m'affiche sa :

    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    import java.util.HashSet;
    import java.util.Set;
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    
    
    public class Dff {
    
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    
    		
    		 final String ZONE_B = "#>";
    		 final String ZONE_E = "#<";
    		 final String VALUE_B = "{";
    		 final String VALUE_E = "}";
    		
    		  String texte = "#----------------------------------------------------------------------\n" +
    					"# Variables\n" +
    					"#----------------------------------------------------------------------\n" +
    					"#> should be formatted by calmod_python\n" +
    					"set conf_etudie = \"{etude}_{SIT}_sylda_{h_sylda}\"\n" +
    					"set dir_listing  = \"{userPath}/{etude}/script/{etude}_{SIT}_sylda_{h_sylda}/{conf_cu}/{logName}/{horodate}/listing\"\n" +
    					"set dir_tem = \"{userPath}/{etude}/script/{etude}_{SIT}_sylda_{h_sylda}/{conf_cu}/{logName}/{horodate}/temoin\"\n" +
    					"set dir_res = \"{userPath}/{etude}/script/{etude}_{SIT}_sylda_{h_sylda}/{conf_cu}/{logName}/{horodate}/results\"\n" +
    					"set dir_UCI_cree = \"{userPath}/{etude}/script/{etude}_{SIT}_sylda_{h_sylda}/{conf_cu}/{logName}/{horodate}/UCI_cree\"\n" +
    					"#< end the formatted line\n" +
    					"set fic_tem =  calmod.tem\n" +
    					"#----------------------------------------------------------------------\n";
    
    		  
    		  
    			Classement cl = new Classement("C:\\Users\\ksmaili\\workspace\\donnees.xml"); 
    	 
    	     
    			Pattern pat = Pattern.compile( "{(\\w)}");
    			Matcher m = pat.matcher(texte );
    			Set<String> keys = new HashSet<String>();
    	 
    			while (m.find()){ // recherche de toutes les clés dans le texte
    				keys.add(m.group(1));
    			}
    	 
    			for (String key : keys){ // remplacement des clés
    			      texte = texte.replaceAll("{" + key + "}", cl.getValueByKey(key));
    			}
    		
    		
    	}
    
    }
    
    output :

    Exception in thread "main" java.util.regex.PatternSyntaxException: Illegal repetition
    {(\w)}
    at java.util.regex.Pattern.error(Unknown Source)
    at java.util.regex.Pattern.closure(Unknown Source)
    at java.util.regex.Pattern.sequence(Unknown Source)
    at java.util.regex.Pattern.expr(Unknown Source)
    at java.util.regex.Pattern.compile(Unknown Source)
    at java.util.regex.Pattern.<init>(Unknown Source)
    at java.util.regex.Pattern.compile(Unknown Source)
    at Dff.main(Dff.java:36)


    bizarre nan??

  8. #8
    Membre Expert
    Avatar de eulbobo
    Homme Profil pro
    Développeur Java
    Inscrit en
    Novembre 2003
    Messages
    786
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Novembre 2003
    Messages : 786
    Par défaut
    Non, c'est normal, c'est juste que je suis un gros boulet :
    les caractères { et } sont utilisés dans les expressions régulières pour désigner un comptage d'éléments...

    Du coup, il faut les échapper, et préciser que tu as plusieurs caractères de type "mot" :

    Pattern pat = Pattern.compile( "\\{(\\w+)\\}");


    Lol oui c'est vrai que c'est plus simple comme tu l'as fait, enfin c'est beaucoupl plus court!!
    Mais vu que je susi débutant j'aurai jamais pu trouver ça! ( je pense).
    Tu peux pas tout savoir, mais tu peux toujours apprendre ^^
    Ensuite, ça te viendra naturellement.

    Aujourd'hui, tu as appris que même quelqu'un qui a l'habitude continuera toujours de se planter lamentablement sur une expression régulière tout bête.

  9. #9
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mai 2014
    Messages : 180
    Par défaut
    Non, c'est normal, c'est juste que je suis un gros boulet :
    les caractères { et } sont utilisés dans les expressions régulières pour désigner un comptage d'éléments...

    Du coup, il faut les échapper, et préciser que tu as plusieurs caractères de type "mot" :

    Pattern pat = Pattern.compile( "\\{(\\w+)\\}")
    D'accord merci

    J'ai une nouvelle erreur mais je crois que c'est à cause de mon texte :
    output :
    Exception in thread "main" java.util.regex.PatternSyntaxException: Illegal repetition
    {SIT}
    at java.util.regex.Pattern.error(Unknown Source)
    at java.util.regex.Pattern.closure(Unknown Source)
    at java.util.regex.Pattern.sequence(Unknown Source)
    at java.util.regex.Pattern.expr(Unknown Source)
    at java.util.regex.Pattern.compile(Unknown Source)
    at java.util.regex.Pattern.<init>(Unknown Source)
    at java.util.regex.Pattern.compile(Unknown Source)
    at java.lang.String.replaceAll(Unknown Source)
    at Dff.main(Dff.java:45)

    Qu'est ce t'ne pense ? avec ma méthode aussi il n'y arriver pas a me donner la valeur de la clé {SIT}

  10. #10
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mai 2014
    Messages : 180
    Par défaut
    Aujourd'hui, tu as appris que même quelqu'un qui a l'habitude continuera toujours de se planter lamentablement sur une expression régulière tout bête.
    Lol ah sa arrive de faire des erreurs bêtes!
    On en apprendra tous les jours sur la programmation!

  11. #11
    Membre Expert
    Avatar de eulbobo
    Homme Profil pro
    Développeur Java
    Inscrit en
    Novembre 2003
    Messages
    786
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Novembre 2003
    Messages : 786
    Par défaut
    Il faut modifier aussi le code du replace du coup :

    texte = texte.replaceAll("\\{" + key + "\\}", cl.getValueByKey(key));

  12. #12
    Expert confirmé Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    3 006
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 3 006
    Par défaut
    Citation Envoyé par eulbobo Voir le message
    Non, c'est normal, c'est juste que je suis un gros boulet :
    les caractères { et } sont utilisés dans les expressions régulières pour désigner un comptage d'éléments...

    Pas si boulet que ça, il y a pas mal de moteurs de regex qui se fichent éperdument d'échapper l'accolade ouvrante dés lors que la situation est sans ambiguïté (tous les cas autres que {n,m}, {n}, {n,}).

    Pour ce qui est de l'accolade fermante, tu peux t'en passer, celle ci ne faisant pas partie des douze caractères spéciaux: . * + ? \ | ( ) { [ ^ $

  13. #13
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mai 2014
    Messages : 180
    Par défaut
    Il faut modifier aussi le code du replace du coup :

    texte = texte.replaceAll("\\{" + key + "\\}", cl.getValueByKey(key));
    toujours erreur...

    mais du coup dans mon code je t'avais dit qu'il ne reconnait pas {SIT} car sa valeur GTO est courte.. du coup pour trouver le mot suivant il ne repart pas de l'accolade précédente.
    je dois jouer sur le po je crois nan??
    po = po - c1 +a un truc comme ça non?

  14. #14
    Membre Expert
    Avatar de eulbobo
    Homme Profil pro
    Développeur Java
    Inscrit en
    Novembre 2003
    Messages
    786
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Novembre 2003
    Messages : 786
    Par défaut
    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
     
    String str = "mon texte {avec} des valeur {entre_cles}" ;
    		Pattern pat = Pattern.compile( "\\{(\\w+)\\}");
    		Matcher m = pat.matcher(str);
    		Set<String> keys = new HashSet<String>();
     
    		while (m.find()){
    			keys.add(m.group(1));
    		}
     
    		for (String key : keys){
    		      System.out.println(key);
    		      str = str.replaceAll("\\{" + key + "\\}", "bla");
    		}
    		System.out.println(str);
    Ce code affiche chez moi :
    entre_cles
    avec
    mon texte bla des valeur bla
    Donc je ne vois pas comment ça peut encore faire des erreurs...


    je t'avais dit qu'il ne reconnait pas {SIT} car sa valeur GTO est courte
    Pas compris ce que tu voulais dire, faut dire je ne vois aucune référence nulle part à SIT ou GTO

Discussions similaires

  1. Une boucle pour associer X actions à X checkbox
    Par nicolas2603 dans le forum ActionScript 1 & ActionScript 2
    Réponses: 1
    Dernier message: 17/10/2007, 15h05
  2. Réponses: 21
    Dernier message: 23/05/2007, 17h16
  3. je sais pas utilisé une boucle pour ?
    Par napz dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 09/10/2006, 02h09
  4. [ImageMagick] Une boucle pour ImageLine ?
    Par isa150183 dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 26/11/2005, 19h41

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