Si la chaîne sur laquelle vous travaillez est très longue, ou si vous travaillez sur de nombreuses chaînes, il peut être intéressant d'utiliser un java.util.regex.Matcher (cela demande du temps pour la compilation, et ne sera donc pas efficace si votre entrée est très petite ou si votre motif de recherche change fréquemment).
Voici un exemple complet, basé sur une liste de jetons tirés d'une carte. (Utilise StringUtils de Apache Commons Lang).
Map<String,String> tokens = new HashMap<String,String>();
tokens.put("cat", "Garfield");
tokens.put("beverage", "coffee");
String template = "%cat% really needs some %beverage%.";
// Create pattern of the format "%(cat|beverage)%"
String patternString = "%(" + StringUtils.join(tokens.keySet(), "|") + ")%";
Pattern pattern = Pattern.compile(patternString);
Matcher matcher = pattern.matcher(template);
StringBuffer sb = new StringBuffer();
while(matcher.find()) {
matcher.appendReplacement(sb, tokens.get(matcher.group(1)));
}
matcher.appendTail(sb);
System.out.println(sb.toString());
Une fois l'expression régulière compilée, l'analyse de la chaîne d'entrée est généralement très rapide (bien que si votre expression régulière est complexe ou implique un retour en arrière, vous devrez toujours procéder à une analyse comparative pour le confirmer).