由于$

问题描述 投票:0回答:1

我有一个函数应该将简单的组合(例如:

&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%

java
1个回答
0
投票

您的问题出在您传递给

#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)))); } }
    
© www.soinside.com 2019 - 2024. All rights reserved.