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 :

regExp ième occurence du masque


Sujet :

Langage Java

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    96
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 96
    Par défaut regExp ième occurence du masque
    Bonjour,
    J'ai une chaîne de caractère comportant certains signes de ponctuation et je voudrai la reformater de la façon suivante : mots espaces Signe de ponctuation espaces mots -> mots Signe espace mots

    Bonjour , comment ça va ? Bien ; et vous?
    ->
    Bonjour, comment ça va? Bien; et vous?

    Le problème est que mon code me renvoie
    Bonjour, comment ça va, Bien, et vous?
    Toutes les occurrences de mon masque sont remplacées par le premier signe trouvé : ici la virgule.

    Si vous voyez où est mon erreur…

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    p = Pattern.compile("([ ])+([.!?;,])([ ])+");
    m = p.matcher(texte);
    if(m.find()){texte = m.replaceAll(m.group(2)+" ");}

    Merci

  2. #2
    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 utilises mal les méthodes find() et group(). Ces méthodes permettent de traiter chacun des éléments trouvés, et doivent être utilisé dans une boucle...

    Ici lorsque tu fais le find(), cela recherche la première occurence correspondante à ta regexp (la première virgule) puis tu effectues donc un replaceAll() avec la chaine ", " "en dur"...

    Pour remplacer toutes les occurences en utilisant la valeur du group(), tu dois utiliser une boucle, par exemple :
    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 texte = "Bonjour , comment ça va ? Bien ; et vous?";
     
    	Pattern p = Pattern.compile("([ ])+([.!?;,])([ ])+");
    	Matcher m = p.matcher(texte);
    	if (m.find()) {
    		StringBuffer sb = new StringBuffer();
    		do {
    			// Pour chaque regexp trouvé on effectue un remplacement :
    			m.appendReplacement(sb, m.group(2) + " ");
    		} while (m.find());
    		// Puis on rajoute la fin du texte (eventuellement)
    		m.appendTail(sb);
     
    		texte = sb.toString();
    	}
    Mais bon en général il suffit d'utiliser directement replaceAll() et les indices via $1, $2, etc...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    	String texte = "Bonjour , comment ça va ? Bien ; et vous?";
     
    	Pattern p = Pattern.compile("([ ])+([.!?;,])([ ])+");
    	Matcher m = p.matcher(texte);
    	texte = m.replaceAll("$2 ");
    Ou plus directement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    	String texte = "Bonjour , comment ça va ? Bien ; et vous?";
     
    	texte = texte.replaceAll("([ ])+([.!?;,])([ ])+", "$2 ");
    Plus d'info : Comment remplacer une sous-chaîne en la reportant dans la chaîne de remplacement ?


    Au passage tu peux simplifier ton expression en évitant de définir un groupe pour les espaces : " +([.!?;,]) +" (et du coup il faut utiliser $1 ou m.group(1) pour obtenir le signe de ponctuation).


    a++

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    96
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 96
    Par défaut
    Merci a toi, je n'ai pas saisi que find et group marchaient comme ça.

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

Discussions similaires

  1. Toutes les occurences Regexp
    Par Anduriel dans le forum MATLAB
    Réponses: 4
    Dernier message: 08/08/2011, 10h19
  2. find + regexp + recup uniquement dernière occurence
    Par Invité dans le forum Shell et commandes GNU
    Réponses: 23
    Dernier message: 21/03/2011, 13h47
  3. Regexp et occurence aléatoire
    Par Gugul dans le forum Langage
    Réponses: 2
    Dernier message: 14/03/2010, 09h29
  4. [AS3 + Masques] Plusieurs occurences dans un masque?
    Par Spiff__ dans le forum ActionScript 3
    Réponses: 5
    Dernier message: 15/06/2008, 12h24
  5. REGEXP definition d'un masque pour nombres
    Par Immobilis dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 01/08/2006, 09h53

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