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

Java Discussion :

[regex] Modifier les captures lors d'un remplacement


Sujet :

Java

  1. #1
    Membre expérimenté
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    1 132
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 132
    Points : 1 418
    Points
    1 418
    Par défaut [regex] Modifier les captures lors d'un remplacement
    Bonjour,

    J'aimerai savoir si il existe des "modifiers" pour la chaine de remplacement dans les regex.

    Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String texte = "mon message à modifier".replaceAll("(\\s|^|\\-)([^\\s\\-])(-1*)","$1\U($2)\L($3)");
    Au lieu de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Pattern p = Pattern.compile("(\\s|^|\\-)([^\\s\\-])([^\\s\\-]*)", Pattern.CASE_INSENSITIVE + Pattern.UNICODE_CASE);
    Matcher m = p.matcher("mon message à modifier");
    StringBuffer res = new StringBuffer();
    while (m.find()) {
    	res.append(m.group(1) + m.group(2).toUpperCase() + m.group(3).toLowerCase());
    }
    String text = res.toString();
    Merci d'avance,

    devyan

  2. #2
    Membre expérimenté
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    1 132
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 132
    Points : 1 418
    Points
    1 418
    Par défaut
    Je le marque comme résolu car il ne semble pas y avoir d'autre solution que la suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    StringBuffer res = new StringBuffer();
    String src = "LA CHAÎNE à convertir(première majuscule sur chaque mot)";
    Pattern p = Pattern.compile("([\\s\\p{Punct}]*)([^\\s\\p{Punct}])([^\\s\\p{Punct}]*)", Pattern.CASE_INSENSITIVE + Pattern.UNICODE_CASE);
    Matcher m = p.matcher(src);
    while (m.find()) {
    	m.appendReplacement(res, m.group(0) + m.group(1).toUpperCase() + m.group(2).toLowerCase());
    }
    m.appendTail(res);
    devyan.

  3. #3
    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,


    Il y a quand même un moyen un peu plus simple pour faire cela !
    En plus attention au appendReplacement() car il faut protéger la chaine de remplacement, sinon tu risques d'avoir des problèmes dans le cas où ta chaine originale contient un \ ou un $, car il sera réinterprété !



    Sinon tu veux mettre la première lettre de chaque mot en majuscule, et le reste en minuscule c'est çà ?

    Dans ce cas tu peux utiliser "\\p{L}" qui représente toutes les lettres, et "\\b" qui représente un séparateur de mot (début de chaine, ponctuations, fin de chaine, etc.)

    Du coup un mot peut être représenté comme ceci : \\b\\p{L}+\\b.
    En séparant le premier caractère du mot et en rajoutant les parenthèses, on obtient ceci : \\b(\\p{L})(\\p{L}*)\\b


    Du coup cela donnerait quelque chose comme cela :
    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
    	public static String uppercaseFirstLetter(String text) {
    		Pattern p = Pattern.compile("\\b(\\p{L})(\\p{L}*)\\b");
    		Matcher m = p.matcher(text);
    		if (m.find()) {
    			StringBuffer sb = new StringBuffer();
    			do {
    				String replacement = m.group(1).toUpperCase()
    						+ m.group(2).toLowerCase();
    				m.appendReplacement(sb, Matcher.quoteReplacement(replacement));
    			} while (m.find());
    			m.appendTail(sb);
    			return sb.toString();
    		}
    		return text;
    	}

    a++

  4. #4
    Membre expérimenté
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    1 132
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 132
    Points : 1 418
    Points
    1 418
    Par défaut
    Bonjour,

    Merci de l'information (\\p{L}) pour le quoteRemplacement() cela fait effectivement l'objet d'un autre de mes messages récents :-)

    J'ai testé la regex simplifiée que tu proposes dans mes TU mais elle ne fonctionne pas pour le premier mot...

    "test_X {jean pierre-étienne (un ,texte ;d'exemple :un peu compliqué à convertir...etc.)tata[toto]titi}"
    est transformé en :
    "test_X {Jean Pierre-Étienne (Un ,Texte ;D'Exemple :Un Peu Compliqué À Convertir...Etc.)Tata[Toto]Titi}"

    devyan

  5. #5
    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
    En effet le "_" ne semble pas faire partie des séparateurs de mots...

    a++

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

Discussions similaires

  1. Réponses: 8
    Dernier message: 29/04/2015, 17h01
  2. Variable pour modifier les liens lors de changement du nom du site
    Par Sohrab dans le forum Général Conception Web
    Réponses: 2
    Dernier message: 29/10/2010, 21h37
  3. modifier les valeurs lors de l'affichage!
    Par NedaRyme dans le forum Débuter
    Réponses: 4
    Dernier message: 04/03/2008, 16h06
  4. Réponses: 2
    Dernier message: 26/02/2007, 15h07
  5. Modifier les données capturées d'un socket
    Par rando dans le forum C++
    Réponses: 6
    Dernier message: 15/11/2005, 21h34

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