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 :

Java Regex remplacer un entier dans une chaine


Sujet :

Collection et Stream Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 9
    Par défaut Java Regex remplacer un entier dans une chaine
    Bonjour à toute et à tous

    J'ai besoin en coup de main de la communauté.

    J'ai la chaîne: (220,150,94,168)294 Je doit remplacer 94(uniquement 94 en non 94 de 294) par (154,32,65)94

    Mon problème que je n'arrive pas trouver le pattern.
    Pour l'instant j'ai le pattern comme ça : (?:[,|(|)])94(?:[,|(|)])

    Mais avec remplaceAll il me prend également les virgules avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Pattern p = Pattern.compile("(?:[,|(|)])"+nodeParent+"(?:[,|(|)])");              System.out.println("Patern = " + p);
      Matcher matcher = p.matcher("(220,150,94,168)294");
      while(matcher.find()) 
      { 
         s = matcher.replaceAll("(154,32,65)94"); 
       }
    Si quelqu'un pourrais m' éclaircir en peu le chemin, ce serais superbe.

    Merci d'avance

  2. #2
    Membre émérite Avatar de herch
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    655
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2006
    Messages : 655
    Par défaut
    salut,

    je crois que tu te compliques la vie, tu pourrais faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    String str = "(220,150,94,168)294";
    String aRemplacer = ",94,";
    str = str.replaceAll(aRemplacer, ",(154,32,65)94,");
    ce qui ne remplacera que le premier 94

    sinon, tu pourrais utiliser replaceFirst pour ne remplacer que la première occurence
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    String str = "(220,150,94,168)294";
    String aRemplacer = "94";
    str = str.replaceFirst(aRemplacer, "(154,32,65)94");
    sinon corrige moi si j'ai mal compris ta question

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 9
    Par défaut
    Salut.

    Oui j'ai pourrais faire ça, mais j'ai donné juste une exemple. La chaîne à traiter je ne connais pas a l'avance et "94" également peut être n'importe quel chiffre qui se trouve ou pas dans la chaîne à traiter, en plus il peut se trouver au début, juste après ( , ou a la fin juste avant ).

    Voici l'exemple de ma chaîne original :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    (222,234,237,282,294,324,327,330,342,345,405,441,444,447,474,483,486,501,552,558,585,588,591,615,618,651,654,666,669,675,729,732,747,771,804,831,834,840,858,879)0
    et voici les exemples des chaînes à placer :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    - (313)300 // à la place de 300 - à l'occurrence n'est pas présent
    - (213)858 //à la place de 858
    - (861)222 //à la place de 222
    - (214)861 //à la place de 861
    - (849,855)879 //à la place de 879
    - (783,789,792)444 //...
    // etc.
    il n'aura pas toujours l'entier à remplacer à 3 chiffres, mais peut être à 2 ou à 1 ou à 4 chiffres.
    C'est pour ça j'aimerai généraliser le traitement avec regex.

  4. #4
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,

    Tu peux utiliser \b qui correspond aux séparateurs de mot. Ainsi \b94\b va te prendre 94 mais pas 294

    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
    	String input = "(222,234,237,282,294,324,327,330,342,345,405,441,444,447,474,483,486,501,552,558,585,588,591,615,618,651,654,666,669,675,729,732,747,771,804,831,834,840,858,879)0";
     
    	// On utilise une Map pour les couples à remplacer :
    	Map<String,String> replacements = new HashMap<String, String>();
    	replacements.put("300", "(313)300");
    	replacements.put("858", "(213)858");
    	// etc...
     
    	// On recherche tous les groupes de chiffres :
    	Matcher matcher = Pattern.compile("\\b[0-9]+\\b").matcher(input);
    	StringBuffer sb = new StringBuffer();
    	while (matcher.find()) {
    		String key = matcher.group();
    		String value = replacements.get(key);
    		if (value==null) {
    			value = key;
    		}
    		matcher.appendReplacement(sb, value);
    	}
    	matcher.appendTail(sb);
    	String result = sb.toString();
     
    	System.out.println(result);
    a++

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 9
    Par défaut
    Très joli solution !

    ... Et en plus juste dans la cible.
    Merci adiGuba. C'est une aide très précieuse.

  6. #6
    Membre Expert Avatar de Uther
    Homme Profil pro
    Tourneur Fraiseur
    Inscrit en
    Avril 2002
    Messages
    4 690
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Tourneur Fraiseur

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 690
    Par défaut
    J'aurais plutôt utilisé les lookahead et lookforward pour résoudre ça de manière simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    String pattern = "(?<!\\d)" + nombreRecherche + "(?!\\d)";
    String resultat = chaineOriginale.replaceAll(pattern,remplacemant);

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

Discussions similaires

  1. Réponses: 9
    Dernier message: 23/12/2013, 16h40
  2. Premiere occurence d'un entier dans une chaine
    Par amika dans le forum Langage
    Réponses: 3
    Dernier message: 04/05/2006, 20h04
  3. [Regex]Recherche de mots dans une chaîne
    Par lionel69 dans le forum Collection et Stream
    Réponses: 7
    Dernier message: 17/11/2005, 18h20
  4. Réponses: 10
    Dernier message: 10/10/2005, 20h46

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