对于快速示例,我有以下字符串:
String s = "hey.there.man.${a.a}crazy$carl${a.b}jones
我也有以下方法:
private String resolveMatchedValue(String s) {
if(s.equals("a.a")) {
return "A";
else if(s.equals("a.b")) {
return "Wallet";
else if(.....
....
}
我的模式是
Pattern pattern = Pattern.compile("\\$\\{(.*?)\\}");
因此对于s中匹配$ {。*}的每个子字符串,我希望调用resolveMatchedValue方法,并且应该用它替换它。理想情况下,在正则表达式过程之后应该
s = "hey.there.man.Acrazy$carl$Walletjones
我已经查看了类似的解决方案,但没有根据匹配的值动态替换匹配值,也无法让它工作
编辑:使用java8
答案 0 :(得分:5)
为了捕获正确的字符,您应该从组[^}]+
中排除右大括号。实际上,只需包含您正在寻找的特定模式以便尽早发现错误,这是更好的做法:
Pattern pattern = Pattern.compile("\\$\\{([a-z]\\.[a-z]+)\\}");
方法Matcher.replaceAll(Function<MatchResult,String> replacer)
旨在完全满足您的要求。传递给该方法的函数在每次匹配时给出,并返回一个字符串以将其替换为。
在你的情况下:
pattern.matcher(input).replaceAll(mr -> resolveMatchedValue(mr.group(1)));
将返回一个字符串,其中包含与替换模式匹配的所有子字符串。
这是一个只是在字段上加上字典的工作示例:
System.out.println(Pattern.compile("\\$\\{([[a-z]\\.[a-z])\\}")
.matcher("hey.there.man.${a.a}crazy$carl${a.b}jones")
.replaceAll(mr -> mr.group(1).toUpperCase()));
在Java 9之前,等效的是:
StringBuffer result = new StringBuffer();
while (matcher.find()) {
matcher.appendReplacement(result, resolvedMatchedValue(matcher.group(1)));
}
matcher.appendTail(result);
之后result.toString()
保存新字符串。