2012-06-10 3 views
0

Existe-t-il un moyen rapide de remplacer toutes les occurrences de modèle par des données dérivées du modèle correspondant? Par exemple, si je voulais remplacer toutes les occurrences d'un nombre à l'intérieur d'une chaîne par le même nombre rempli à une longueur fixe avec 0s. Dans ce cas, si la longueur est 4, ab3cd5 deviendra ab0003cd0005. Mon idée utilisait un StringBuilder et 2 modèles: l'un recevait tous les nombres et l'autre obtenait tout ce qui n'était pas un nombre, et ajoutait les correspondances au constructeur par l'index des correspondances trouvées.String.replaceAll variation

Je pense qu'il pourrait y avoir quelque chose de plus simple.

+0

si vous êtes sûr que le nombre sera alwa ys être un seul chiffre, alors il est assez facile de faire une regex, mais si votre remplissage doit dépendre de la longueur du nombre préexistant alors je ne pense pas qu'il y ait une manière regex y faire (bien que je sois curieux ce que les autres disent). –

Répondre

2

Vous pouvez probablement obtenir ce que vous êtes après avoir utilisé appendReplacement et appendTail, quelque chose comme ceci:

importation java.util.regex.Pattern; import java.util.regex.Matcher;

String REGEX = "(\\d+)"; 
String INPUT = "abc3def45"; 
NumberFormat formatter = new DecimalFormat("0000"); 

Pattern p = Pattern.compile(REGEX); 
Matcher m = p.matcher(INPUT); // get a matcher object 
StringBuffer sb = new StringBuffer(); 
while(m.find()){ 
    m.appendReplacement(sb,formatter.format(Integer.parseInt(m.group(1)))); 
} 

m.appendTail(sb); 

String result = sb.toString(); 
+0

J'ai mis à jour la réponse après l'avoir testée. –

+0

est allé pour cette solution merci –

1

Si vous savez exactement combien de zéros que vous voulez pad avant que tout seul numéro, alors quelque chose comme cela devrait fonctionner:

String text = "ab3cd5"; 
text = text.replaceAll("\\d","0000$0"); 
System.out.println(text); 

Sinon:

Pattern pattern = Pattern.compile("\\d+"); 
Matcher matcher = pattern.matcher(text); 

StringBuffer result = new StringBuffer(); 
while(matcher.find()){ 
    matcher.appendReplacement(result, String.format("%04d", Integer.parseInt(matcher.group()))); 
} 
matcher.appendTail(result); 
System.out.println(result); 

Le format %04d moyen : un nombre entier, complété par zéro jusqu'à une longueur de 4.