以下方法将完成工作:
static String replace(String text, Map<String, String> values) {
StringBuilder result = new StringBuilder();
int textIdx = 0;
for (int startIdx; (startIdx = text.indexOf('[', textIdx)) != -1; ) {
int endIdx = text.indexOf(']', startIdx + 1);
if (endIdx == -1)
break;
result.append(text.substring(textIdx, startIdx));
textIdx = endIdx + 1;
String value = values.get(text.substring(startIdx + 1, endIdx));
if (value != null && ! value.isEmpty()) {
result.append(value);
} else if (result.length() != 0 && result.charAt(result.length() - 1) == ' ') {
result.setLength(result.length() - 1);
} else if (textIdx < text.length() && text.charAt(textIdx) == ' ') {
textIdx++;
}
}
result.append(text.substring(textIdx));
return result.toString();
}
测试
public static void main(String[] args) {
test("[prefix] [name] [suffix]: [msg]",
Map.of("prefix", "Hello",
"name", "username",
"suffix", "World",
"msg", "Test message"));
test("[prefix] [name] [suffix]: [msg]",
Map.of("name", "username",
"suffix", "World",
"msg", "Test message"));
test("[prefix] [name] [suffix]: [msg]",
Map.of("prefix", "Hello",
"suffix", "World",
"msg", "Test message"));
test("[prefix] [name] [suffix]: [msg]",
Map.of("prefix", "Hello",
"name", "username",
"msg", "Test message"));
test("[prefix] [name] [suffix]: [msg]",
Map.of("prefix", "Hello",
"name", "username",
"suffix", "World"));
test("[prefix] [name] [suffix]: [msg]",
Map.of());
}
static void test(String text, Map<String, String> values) {
System.out.println('"' + replace(text, values) + '"');
}
输出
"Hello username World: Test message"
"username World: Test message"
"Hello World: Test message"
"Hello username: Test message"
"Hello username World:"
":"
注意当连续的占位符缺失/为空时,多个空格会被正确消除。
msg
为空或者冒号前的第一部分为空,您是否想要保留:
? - Youcef LAIDANI