Optimiser un .replace()



  • Bonjour à tous !

    Je viens vers vous pour savoir si vous auriez une meilleure méthode que la mienne pour parvenir à remplacer des mots par d'autres dans un fichiers en évitant ce gros paté:

    
        private String[][] templateWordsToReplace = new String[][] {
    {"#modid", "#name", "#description", "#version", "#credits", "#logoFile", "#mcversion", "#url", "#updateUrl", "#authors", "#screenshots", "#dependencies"}, {"modid", "name", "description", "version", "credits", "logoFile", "mcversion", "url", "updateUrl", "authors", "screenshots", "dependencies"}};
    
    bufferedWriter.write(getFileTemplateContent()
                        .replace(this.templateWordsToReplace[0][0], this.templateWordsToReplace[1][0])
                        .replace(this.templateWordsToReplace[0][1], this.templateWordsToReplace[1][1])
                        .replace(this.templateWordsToReplace[0][2], this.templateWordsToReplace[1][2])
                        .replace(this.templateWordsToReplace[0][3], this.templateWordsToReplace[1][3])
                        .replace(this.templateWordsToReplace[0][4], this.templateWordsToReplace[1][4])
                        .replace(this.templateWordsToReplace[0][5], this.templateWordsToReplace[1][5])
                        .replace(this.templateWordsToReplace[0][6], this.templateWordsToReplace[1][6])
                        .replace(this.templateWordsToReplace[0][7], this.templateWordsToReplace[1][7])
                        .replace(this.templateWordsToReplace[0][8], this.templateWordsToReplace[1][8])
                        .replace(this.templateWordsToReplace[0][9], this.templateWordsToReplace[1][9])
                        .replace(this.templateWordsToReplace[0][10], this.templateWordsToReplace[1][10])
                        .replace(this.templateWordsToReplace[0][11], this.templateWordsToReplace[1][11])
                                           );
    
    

    J'ai essayer une boucle for pour remplacer de manière plus simple les mots du tableau, mais ça me ganère à chaque fois le fichier en remplaçant 1 seul mot à la fois

    Si jamais quelqu'un à une solution, je suis prenneur !

    Oui ça n'est pas spécialement pour du forge, mais ça peux servir pour des moddeurs quand même si une solution est trouvée 🙂



  • Si c'est pour remplacer du texte, pourquoi ne pas utiliser les expressions régulières ?



  • Je sais qu'il y a une différence entre replace() et replaceAll() mais qu'elle n'est pas du tout intuitive, les méthodes étant mal nommé.
    Peut-être chercher autour de ça, surtout pour ta culture général parce que dans la pratique, niveau optimisation c'est pas ça ^^

    Les regexp peuvent être plus efficace il me semble 😉

    Si tu veux quelque chose de plus propre et de plus maintenable, je peux te proposer ceci :

    Une classe "MotARemplacer" qui contient une fonction getPattern() qui retourne le motif que tu souhaites remplacer et une fonction getReplacement() qui te retourne la chaine de caractère en remplacement.
    Ensuite tu dispose d'une classe "B" qui va contenir une Map <string, motaremplacer="">et une methode pour ajouter un mot du style :

    register(MotARemplacer mot ) {
    map.put(mot.getPattern(), mot);
    }
    

    une methode pour supprimer un mot et une autre pour convertir une chaine avec les mots remplacé ;)</string,>



  • J'ai fais un test avec :

    
    String wordsToReplace = "#modid #name #description #version #credits #logoFile #mcversion #url #updateUrl #authors #screenshots #dependencies";
    
    wordsToReplace = wordsToReplace.replaceAll("#(.*?)", "$1");
    System.out.println("  test :"+wordsToReplace);
    

    Ce qui me donne : 
     test :modid name description version credits logoFile mcversion url updateUrl authors screenshots dependencies

    Donc  :

    
     bufferedWriter.write(getFileTemplateContent().replaceAll("#(.*?)", "$1"));
    
    

    devrait être ce que tu recherche .
    Edit : 
    Ou encore plus simple :

    
     bufferedWriter.write(getFileTemplateContent().replaceAll("#", ""));
    
    

  • Administrateurs

    Le problème c'est qu'il veut remplacer #modid par quelque chose qui ne sera pas modid. (mais le modid d'un mod)
    Sinon en effet il aurait juste fallut retirer le #.