Perte d'un caractere suite à un replaceAll sur un Matcher

Résolu
Signaler
Messages postés
6414
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
29 juillet 2020
-
Messages postés
6414
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
29 juillet 2020
-
Bonjour,

Je code actuelement un utilitaire qui permettra de remplacer des varaibles écrites en commandes dos par des variables en bash.

En gros, il faut sur une ligne remplacer tous les %variable% par $(variable). Le code fonctionne sauf que je perd le caractère qui précède ma variable : par exemple System.out.println(TraducteurVariables.getInstance().traduire("abc%var%")); me retourne ab${var} au lieu de abc${var}

Je ne comprend pas très bien mon erreur. Je vous laisse mon code, si vous avez une idée...

	@Override
public String traduire(String texteDos) {
Pattern p = Pattern.compile("[^%]??%([^%]+?)%[^%]??");
Matcher m = p.matcher(texteDos);
return m.replaceAll("\\${$1}");
}

4 réponses

Messages postés
987
Date d'inscription
mardi 31 mai 2005
Statut
Membre
Dernière intervention
30 août 2012
25
Bonjour.
Essaye avec ce pattern :
Pattern p = Pattern.compile("%([^%]+?)%[^%]??");
Messages postés
6414
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
29 juillet 2020
362
Si vous répondez, je ne pourrai pas vous répondre avant lundi, mais je le ferai, soyez en certain
Messages postés
49
Date d'inscription
jeudi 14 avril 2005
Statut
Membre
Dernière intervention
27 novembre 2011
9
Bonjour

Si j'ai bien compris, tu souhaiterais ne pas faire de remplacement dans les chaînes "abc%%def%" ou "abc%def%%". Dans ce cas, ton expression régulière est fausse.

Celle-ci devrait fonctionner:
regexp : "([^%]|^)%([^%]+?)%([^%]|$)"
remplacement : "$1\\${$2}$3"

Si au contraire elles doivent l'être, pas besoins de préfixe, ni de suffixe:
regexp : "%([^%]+?)%"
remplacement : "\\${$1}"


Ton erreur:
"[^%]??" est toujours vrai, puisqu'une chaîne vide la vérifie, donc dans "%%abc%", "%abc%" vérifie ton rexgexp et le remplacement donnera "%${abc}". Et s'il a un caractère autre que '%', il est remplacé avec le reste, dans "abc%def%", "c%def%" vérifie ton rexgexp et le remplacement donne "ab${def}".

Benoit.
Messages postés
6414
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
29 juillet 2020
362
Super ca marche !

Merci