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

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

    Informations forums :
    Inscription : Mars 2009
    Messages : 9
    Points : 8
    Points
    8
    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 éclairé Avatar de herch
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    655
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2006
    Messages : 655
    Points : 773
    Points
    773
    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
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 9
    Points : 8
    Points
    8
    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 sénior
    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
    Points : 23 190
    Points
    23 190
    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
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 9
    Points : 8
    Points
    8
    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
    Expert éminent sénior Avatar de Uther
    Homme Profil pro
    Tourneur Fraiseur
    Inscrit en
    Avril 2002
    Messages
    4 607
    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 607
    Points : 15 652
    Points
    15 652
    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);

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

    Informations forums :
    Inscription : Mars 2009
    Messages : 9
    Points : 8
    Points
    8
    Par défaut
    Uther, salut.
    Et pourquoi c'est plus simple ?
    Est-ce que tu peut m'expliquer le pattern s'il te plait ?
    je vais essayer les deux et je vais voir le temps d'exécution sur les les chaînes longues.
    merci.

  8. #8
    Expert éminent sénior Avatar de Uther
    Homme Profil pro
    Tourneur Fraiseur
    Inscrit en
    Avril 2002
    Messages
    4 607
    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 607
    Points : 15 652
    Points
    15 652
    Par défaut
    Non en effet, ce n'est pas plus simple dans ce cas particulier, je n'avait pas lu assez attentivement le message de Adiguba. Il utilise "\b" qui comme les lookahead et lookforward ne consomme pas de caractère.

+ 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