import java.util.HashMap;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Main {
public static void main
(String[] args
) { Map
<String, String
> tokensMap
= new HashMap
<>(); tokensMap.put("fizz", "abc");
tokensMap.put("buzz", "123");
System.
out.
println(substituteAllTokens
(tokensMap,
"${fizz}${buzz}")); }
private static String substituteAllTokens
(Map
<String, String
> tokensMap,
String toInspect
) { String regex
= "\\$\\{([^}]*)\\}"; Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(toInspect);
while (matcher.find()) {
String token
= matcher.
group(); // Ex: ${fizz} String tokenKey
= matcher.
group(1); // Ex: fizz String replacementValue
= null;
if (tokensMap.containsKey(tokenKey))
replacementValue = tokensMap.get(tokenKey);
else
toInspect = toInspect.replaceFirst(Pattern.quote(token), replacementValue);
}
return toInspect;
}
}
aW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwppbXBvcnQgamF2YS51dGlsLk1hcDsKaW1wb3J0IGphdmEudXRpbC5yZWdleC5NYXRjaGVyOwppbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47CgpwdWJsaWMgY2xhc3MgTWFpbiB7CgogICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewogICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gdG9rZW5zTWFwID0gbmV3IEhhc2hNYXA8PigpOwogICAgICAgIHRva2Vuc01hcC5wdXQoImZpenoiLCAiYWJjIik7CiAgICAgICAgdG9rZW5zTWFwLnB1dCgiYnV6eiIsICIxMjMiKTsKICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oc3Vic3RpdHV0ZUFsbFRva2Vucyh0b2tlbnNNYXAsICIke2Zpenp9JHtidXp6fSIpKTsKICAgIH0KCiAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgc3Vic3RpdHV0ZUFsbFRva2VucyhNYXA8U3RyaW5nLCBTdHJpbmc+IHRva2Vuc01hcCwgU3RyaW5nIHRvSW5zcGVjdCkgewogICAgICAgIFN0cmluZyByZWdleCA9ICJcXCRcXHsoW159XSopXFx9IjsKICAgICAgICBQYXR0ZXJuIHBhdHRlcm4gPSBQYXR0ZXJuLmNvbXBpbGUocmVnZXgpOwogICAgICAgIE1hdGNoZXIgbWF0Y2hlciA9IHBhdHRlcm4ubWF0Y2hlcih0b0luc3BlY3QpOwogICAgICAgIHdoaWxlIChtYXRjaGVyLmZpbmQoKSkgewogICAgICAgICAgICBTdHJpbmcgdG9rZW4gPSBtYXRjaGVyLmdyb3VwKCk7IC8vIEV4OiAke2Zpenp9CiAgICAgICAgICAgIFN0cmluZyB0b2tlbktleSA9IG1hdGNoZXIuZ3JvdXAoMSk7IC8vIEV4OiBmaXp6CiAgICAgICAgICAgIFN0cmluZyByZXBsYWNlbWVudFZhbHVlID0gbnVsbDsKCiAgICAgICAgICAgIGlmICh0b2tlbnNNYXAuY29udGFpbnNLZXkodG9rZW5LZXkpKQogICAgICAgICAgICAgICAgcmVwbGFjZW1lbnRWYWx1ZSA9IHRva2Vuc01hcC5nZXQodG9rZW5LZXkpOwogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiU3RyaW5nIGNvbnRhaW5lZCBhbiB1bnN1cHBvcnRlZCB0b2tlbi4iKTsKCiAgICAgICAgICAgIHRvSW5zcGVjdCA9IHRvSW5zcGVjdC5yZXBsYWNlRmlyc3QoUGF0dGVybi5xdW90ZSh0b2tlbiksIHJlcGxhY2VtZW50VmFsdWUpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIHRvSW5zcGVjdDsKICAgIH0KfQ==