我有一个函数应该将简单的组合(例如:
&a &c &b &l
)替换为聊天解释器可以理解和解析的东西(<color:green>
等...)
但是当使用类似
&a$&e%price%
之类的东西时,我收到非法组引用错误
我先处理补价!
这是我的代码:
public class Chat {
private static final Pattern PATTERN = Pattern.compile("([^\\\\]?)&([0-9a-fk-r])");
private static final Map<String, String> COLOR_CODES = new HashMap<>() {{
put("0", "<reset><color:black>");
put("1", "<reset><color:dark_blue>");
put("2", "<reset><color:dark_green>");
put("3", "<reset><color:dark_aqua>");
put("4", "<reset><color:dark_red>");
put("5", "<reset><color:dark_purple>");
put("6", "<reset><color:gold>");
put("7", "<reset><color:gray>");
put("8", "<reset><color:dark_gray>");
put("9", "<reset><color:blue>");
put("a", "<reset><color:green>");
put("b", "<reset><color:aqua>");
put("c", "<reset><color:red>");
put("d", "<reset><color:light_purple>");
put("e", "<reset><color:yellow>");
put("f", "<reset><color:white>");
put("k", "<obfuscated>");
put("l", "<bold>");
put("m", "<strikethrough>");
put("n", "<underlined>");
put("o", "<italic>");
put("r", "<reset>");
}};
public static Component translate(String text) {
// Then apply color codes
return Colors.interprate(replaceprimitive(text.replaceAll(String.valueOf(LegacyComponentSerializer.SECTION_CHAR), "&")));
}
private static String replaceprimitive(String string) {
return PATTERN.matcher(string).replaceAll(matchResult -> matchResult.group(1) + COLOR_CODES.get(matchResult.group(2)));
}
}
我是这样称呼它的:
sender.send(Chat.translate("&c$&e%test%".replaceAll("%test%", "100")));
请注意,如果 $ 和数字之间没有简单代码,则不会出现此问题:
&c$%test%" doesn't cause any issues but
$&l%test%` 会出现
我尝试过使用 Matcher.quoteReplacement,甚至尝试手动执行并替换
$ -> \\$
但没有任何效果。
注意:进入函数前需要替换占位符
%price%
您的问题出在您传递给
#replaceAll
的 lambda 表达式中:
matchResult ->
matchResult.group(1) +
COLOR_CODES.get(matchResult.group(2));
matchResult.group(1)
的结果有时是$
。您希望将其解释为文字 $
来替换为字符串,但 $
在匹配器中是特殊的 如此处记录的 。您需要在 lambda 返回的替换字符串中转义任何文字 $
和 \
。
您可以使用此处记录的
Matcher.quoteReplacement(...)
方法来完成此操作。
这是代码的固定版本:
private static final Map<String, String> COLOR_CODES = new HashMap<>() {{
put("0", "<reset><color:black>");
put("1", "<reset><color:dark_blue>");
put("2", "<reset><color:dark_green>");
put("3", "<reset><color:dark_aqua>");
put("4", "<reset><color:dark_red>");
put("5", "<reset><color:dark_purple>");
put("6", "<reset><color:gold>");
put("7", "<reset><color:gray>");
put("8", "<reset><color:dark_gray>");
put("9", "<reset><color:blue>");
put("a", "<reset><color:green>");
put("b", "<reset><color:aqua>");
put("c", "<reset><color:red>");
put("d", "<reset><color:light_purple>");
put("e", "<reset><color:yellow>");
put("f", "<reset><color:white>");
put("k", "<obfuscated>");
put("l", "<bold>");
put("m", "<strikethrough>");
put("n", "<underlined>");
put("o", "<italic>");
put("r", "<reset>");
}};
public static Component translate(String text) {
// Then apply color codes
return Colors.interprate(replaceprimitive(text.replaceAll(String.valueOf(LegacyComponentSerializer.SECTION_CHAR), "&")));
}
private static String replaceprimitive(String string) {
return PATTERN.matcher(string).replaceAll(matchResult ->
Matcher.quoteReplacement(matchResult.group(1) + COLOR_CODES.get(matchResult.group(2))));
}
}