J'utiliserais String.indexOf(String sep, int start)
dans une boucle à plusieurs reprises pour copier du texte et des valeurs dans un StringBuilder.
Quelque chose comme
public static void main(String... args) throws IOException {
Map<String, String> map = new LinkedHashMap<>();
map.put("abc", "ABC");
map.put("xyz", "XYZ");
printSubstitue("nothing to change", map);
printSubstitue("(&(objectclass=${abc})(uid=${xyz})(cn=${cn})(special='${'))", map);
}
private static void printSubstitue(String text, Map<String, String> map) {
String text2 = subtitue(text, map);
System.out.println("substitue("+text+", "+map+") = "+text2);
}
public static String subtitue(String template, Map<String, String> map) {
StringBuilder sb = new StringBuilder();
int prev = 0;
for (int start, end; (start = template.indexOf("${", prev)) > 0; prev = end + 1) {
sb.append(template.substring(prev, start));
end = template.indexOf('}', start + 2);
if (end < 0) {
prev = start;
break;
}
String key = template.substring(start + 2, end);
String value = map.get(key);
if (value == null) {
sb.append(template.substring(start, end + 1));
} else {
sb.append(value);
}
}
sb.append(template.substring(prev));
return sb.toString();
}
impressions
substitue(nothing to change, {abc=ABC, xyz=XYZ}) = nothing to change
substitue((&(objectclass=${abc})(uid=${xyz})(cn=${cn})(special='${')), {abc=ABC, xyz=XYZ})
= (&(objectclass=ABC)(uid=XYZ)(cn=${cn})(special='${'))
Il devient malpropre si vous voulez soutenir ${ }
imbriquées les valeurs. ;)
abc123=ghi123
abc${xyz}=def${xyz}
(&(objectclass=${abc${xyz}})(uid=${xyz}))
Je vous suggère de garder les choses simples si vous le pouvez. ;)
Et vous voulez remplacer par quoi? Avez-vous une sorte de carte pour les remplacements? – fge
remplacer par des chaînes simples. $ {abc} sera remplacé par une autre chaîne abc –
Oui, mais d'où tenez-vous ces chaînes? – fge