使用分隔符获取字符串的某些部分

问题描述

我正在使用 String message = event.message.getFormattedText(); 获取消息文本,目前我将 minecraft 玩家的用户名更改为 message = message.replaceAll("(?i)" + minecraft.getminecraft().thePlayer.getName(),NameAndColorUtils.nickname);。但是,某些消息的结构如下:

Title [RANK] Username: Message 


Rookie [VIP] Player: Hello!

我希望能够同时获取分隔符“[”和“]”,以及两者之间的文本,并将其替换为我选择的字符串。例如,将 [VIP] 更改为 [MVP],或者完全移除排名(取决于用户的输入)。我该怎么做?

解决方法

使用正则表达式替换循环,例如像这样:

static String replace(String message) {
    StringBuffer buf = new StringBuffer();
    Matcher m = Pattern.compile("\\[([^\\]]+)\\](\\s*)").matcher(message);
    while (m.find()) {
        String tag = m.group(1);
        if (tag.equals("RANK")) {
            // Remove tag and trailing space
            m.appendReplacement(buf,"");
        } else if (tag.equals("VIP")) {
            // Replace tag and keep trailing space
            m.appendReplacement(buf,"{MVP}" + m.group(2));
        }
        // No else clause means that text is left intact for unknown tags
    }
    return m.appendTail(buf).toString();
}

测试

System.out.println(replace("Title [RANK] Username: Message"));
System.out.println(replace("Rookie [VIP] Player: Hello!"));
System.out.println(replace("Hello [FOO] World"));

输出

Title Username: Message
Rookie {MVP} Player: Hello!
Hello [FOO] World