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

API standards et tierces Java Discussion :

[String] [ReplaceAll] comment despecialiser ?


Sujet :

API standards et tierces Java

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 16
    Points : 16
    Points
    16
    Par défaut [String] [ReplaceAll] comment despecialiser ?
    Bonjour,
    je veux remplacer une clé de type "$NOM" par sa valeur.

    Mais je ne trouve pas comment despecialiser le '$'


    J'ai déjà essayé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    flux.replaceAll("(\\$NOM)",vue.getNom());
    flux.replaceAll("\\$NOM", vue.getNom());
    si une personne connait la solution, j'en serai ravi !

    merci

  2. #2
    Membre éclairé
    Avatar de seiryujay
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 950
    Points : 722
    Points
    722
    Par défaut
    Et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    flux.replaceAll("\$NOM", vue.getNom());
    avec un seul anti-slash?

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 16
    Points : 16
    Points
    16
    Par défaut
    non plus, je l'ai testé aussi celui là !

  4. #4
    Membre habitué Avatar de Wookai
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2004
    Messages
    307
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2004
    Messages : 307
    Points : 180
    Points
    180
    Par défaut
    Non, un seul anti-slash ne fonctionne pas. Bizarre que ça ne fonctionne pas avec les deux.

  5. #5
    Membre habitué Avatar de Wookai
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2004
    Messages
    307
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2004
    Messages : 307
    Points : 180
    Points
    180
    Par défaut
    Mais attention ! replaceAll() ne modifie pas ta chaîne "flux" (l'objet String est immutable, il me semble qu'on le dit tous les jours ici...).

    Donc si tu veux voir un résultat il faut faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String res = flux.replaceAll("\\$NOM", vue.getNom());
    J'espère que ça t'aide !

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 16
    Points : 16
    Points
    16
    Par défaut
    arf....
    merci ! Ce soir je suis en vacances, faut me pardonner !

  7. #7
    Membre actif
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Mars 2005
    Messages
    363
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mars 2005
    Messages : 363
    Points : 210
    Points
    210
    Par défaut
    l'objet String est immutable, il me semble qu'on le dit tous les jours ici...).
    je le confirme on le voit bien une fois par jour et ça surprend la première fois qu'on voit ce mot

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 16
    Points : 16
    Points
    16
    Par défaut
    En règle générale, je traine plutot du coté J2EE. Mais je n'ai pas d'excuse : je le savais.

  9. #9
    Membre habitué Avatar de Wookai
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2004
    Messages
    307
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2004
    Messages : 307
    Points : 180
    Points
    180
    Par défaut
    Lol, ya pas de problème ! Je t'avouerais que j'ai vite fait le test et j'ai fait la même faute ! C'est juste que ça fait quelques jours que je lis pas mal de posts, et ce sujet revient souvent !

    Citation Envoyé par tck-lt
    ça surprend la première fois qu'on voit ce mot
    C'est clair, ça marque ! D'ailleurs, j'avais cru à une erreur la première fois ...

  10. #10
    Membre expert Avatar de KiLVaiDeN
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 860
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 860
    Points : 3 444
    Points
    3 444
    Par défaut
    Si ton application n'exige pas une consommation faible de mémoire, ta méthode est valable et pratique.

    Par contre si ton application est partagée ou que ce bout de code est appellé à répétition, il ne faut pas oublier que le fait que les Strings soient "immutables" ( comme il a été précisé plus haut ) implique qu'à chaque replaceAll, une nouvelle String complète sera placée en mémoire.

    Bon le garbage collector est censé s'en occuper, mais il vaut mieux parfois éviter de le solliciter, et produire une application legère en consommation mémoire, car on a beau vanter les mérites du GC, ça ne se joue pas seulement au niveau de l'application en elle même, mais au niveau de la gestion des ressources de l'OS, qui lui n'apprécie pas forcément qu'un programme java utilise 80% de la mémoire sans lancer son GC, sous pretexte que l'opération "lourde" de GC n'a pas eu besoin de s'executér car il y a encore de la mémoire libre Oula je sais pas si c'est bien français ce que je viens de dire !

    Je tire mon exemple d'application sur lesquelles je suis intervenue, utilisant par exemple un serveur tomcat, qui ne purgeait pas les ressources tout simplement parce que le GC ne jugeait pas cela necessaire, malgré le fait que l'os a jugé que ça impactait sur les autres processus système; tant que le GC n'a pas libéré la mémoire, l'OS n'a aucun moyen de savoir si la mémoire utilisée par la JVM est valable ou non..

    K

  11. #11
    Membre habitué Avatar de Original Prankster
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    226
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juillet 2005
    Messages : 226
    Points : 192
    Points
    192
    Par défaut Re: [String] [ReplaceAll] comment despecialiser ?
    Citation Envoyé par DeeJimy
    Bonjour,
    je veux remplacer une clé de type "$NOM" par sa valeur.

    Mais je ne trouve pas comment despecialiser le '$'
    Je m'excuse mais je ne comprends pas les termes "clés", "despécialiser" et "immutable"... En bref je n'ai pas compris le problème ni la solution, pourtant ça m'intéresse...

    Quelqu'un peut-il prendre le temps de m'expliquer ? (Pour immutable j'imagine que ça veut dire qu'un String n'est pas transformable ?)

    Merci d'avance

  12. #12
    Membre habitué Avatar de Wookai
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2004
    Messages
    307
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2004
    Messages : 307
    Points : 180
    Points
    180
    Par défaut
    J'ai pas de dictionnaire, mais en gros ça veut ça, oui ! Les clés sont les éléments qu'il veut remplacer, quant à despécialiser, il voulait dire "faire comprendre à Java que $ ne représente pas une fin d'expression régulière mais bien le symbole monétaire américain" .

    Son problème est le suivant : il a une chaîne du type
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Salut $NOM, comment ça va aujourd'hui ?
    et il aimerait y remplacer toutes les occurences de "$NOM" par "Jean-Claude", par exemple.

    Il a tout tout naturellement utilisé replaceAll(). Simplement, il a fait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    String s = "Salut $NOM, comment ça va aujourd'hui ?";
    s.replaceAll("\\$NOM", "Jean-Claude");
    System.out.println(s);
    Et qu'a-t-il obtenu ? Ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Salut $NOM, comment ça va aujourd'hui ?
    Hé oui, comme les objets String sont immutables, s est toujours le même ! Il suffisait donc de faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    String s = "Salut $NOM, comment ça va aujourd'hui ?";
    String resultat = s.replaceAll("\\$NOM", "Jean-Claude");
    System.out.println(resultat);
    pour obtenir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Salut Jean-Claude, comment ça va aujourd'hui ?
    Voilà !

  13. #13
    Membre expert Avatar de KiLVaiDeN
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 860
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 860
    Points : 3 444
    Points
    3 444
    Par défaut
    Dans l'ordre :

    Une "clé" ( terme utilisé de manière aléatoire en général ) est un mot ou un objet qui a une signification, un libellé par exemple pourrait être une clé, car il mène au contenu d'une variable. L'indice d'un tableau est un autre exemple de clé.

    Dans une chaine de caractère, il y a des caractères spéciaux. Par exemple, en Java, l'antislash ( "\" ) ne peut pas être utiliser tel quel, car il faut d'abord le "despécialiser" ( terme barbare ) pour qu'il perde sa signification de "caractère d'échappement". Il faut utiliser "\\" pour l'afficher.

    Immutable ( 2ème terme barbare ) signifie qu'il a une représentation figée en mémoire. Un String en Java, est un tableau placé en mémoire dans un emplacement dédié aux constantes. Un replace ne modifie pas le String en mémoire, mais en crée un nouveau.

    K

  14. #14
    Rédacteur
    Avatar de romaintaz
    Homme Profil pro
    Java craftsman
    Inscrit en
    Juillet 2005
    Messages
    3 790
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Java craftsman
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2005
    Messages : 3 790
    Points : 7 275
    Points
    7 275
    Par défaut Re: [String] [ReplaceAll] comment despecialiser ?
    clé -> basé sur le principe clé / valeur. On utilise une clé, à qui correspond une valeur particulière (qui varie selon les conditions).

    déspécialiser -> Mot un peu bizarre dont je ne suis pas trop sûr de la définition. Mais je dirais que c'est l'action de transformer la clé en sa valeur.
    Edit: Bon, c'est pas trop ça, donc voir les autres définitions...

    immutable -> Les Strings sont des objets qui ne peuvent pas être modifiés (malgré l'apparence). En gros, quand tu concatènes (tu "colles") 2 Strings, en fait Java crée un 3e String qui contient les 2 Strings imbriqués.

    Dans le présent cas, notre ami faisait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    flux.replaceAll("(\\$NOM)",vue.getNom());
    Or, comme un String est immutable, la méthode replaceAll ne peut pas modifier le String flux, et donc retourne une nouvelle String modifiée.
    D'où l'importance de faire cela plutôt :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    flux = flux.replaceAll("(\\$NOM)",vue.getNom());
    C'est plus clair ?

  15. #15
    Membre habitué Avatar de Original Prankster
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    226
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juillet 2005
    Messages : 226
    Points : 192
    Points
    192
    Par défaut
    OK, j'ai tout pigé merci beaucoup pour vos réponses rapides et claires.

    Evidemment s'il avait utilisé "protéger le caractère spécial $" au lieu de "despécialiser" j'aurais pigé tout de suite, mais j'avoue que "clé" et "despécialiser" m'ont fait croire qu'on ne parlait pas Java...

    Par contre ya un autre truc que je comprends pas : quel rapport entre un String immutable et un grand esprit ?? 8)

    Encore merci, les "grands esprits"

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

Discussions similaires

  1. probleme avec string.replaceall(" ", "/")
    Par danou07200 dans le forum Débuter
    Réponses: 3
    Dernier message: 21/11/2008, 23h31
  2. [String] ReplaceAll et ponctuation
    Par Mascotte dans le forum Langage
    Réponses: 6
    Dernier message: 01/03/2007, 15h01
  3. Probleme String replaceAll
    Par viscere dans le forum Langage
    Réponses: 13
    Dernier message: 03/07/2006, 09h22
  4. [String][replaceAll][Expression régulière]Remplacement multi
    Par cpr0 dans le forum Collection et Stream
    Réponses: 9
    Dernier message: 09/04/2004, 16h40
  5. [regex][string] replaceAll bogué ?
    Par 7eme dans le forum Collection et Stream
    Réponses: 4
    Dernier message: 13/11/2003, 16h36

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