匹配和排序 Bukkit ChatColor 表达式

Matching and sorting a Bukkit ChatColor expression

我按空格拆分一个字符串,然后检查每个部分是否包含代码(&a、&l 等)。如果匹配,我必须抓取彼此相邻的代码,然后按字母数字顺序对它们进行排序(0、1、2 ... a、b、c ...)。

这是我到目前为止尝试过的方法:

String message = "&l&aCheckpoint&m&6doreime";
String[] parts = message.split(" "); // This may not be needed for the example, but I'm only using one word for simplicity here
List<String> orderedMessage = new ArrayList<>();
Pattern pattern = Pattern.compile("((?:&|\u00a7)[0-9A-FK-ORa-fk-or])(.*?)"); // Completely matches the entire pattern, not what i want

for (String part : parts) {
    if (pattern.matcher(part).matches()) {
        List<String> orderedParts = new ArrayList<>();
        // what do i do?
    }
}

我需要更改 pattern 值,以便它匹配这样的组:

Match: &l&aCheckpoint
Groups that I need: [&l, &a, Checkpoint]

Match: &m&6doreime
Groups that I need: [&m, &6, doreime]

我怎样才能匹配显示的每个 Match 并将其分成 3 组(其中它将每个代码部分 (&[0-9A-FK-ORa-fk-or]) 和剩余文本拆分到另一个代码部分?

信息:如果有人想知道为什么,当您向 Minecraft 提交 color/format 编码文本时,颜色必须先出现 或格式 ([a-fk-or]) 代码将被忽略,因为 Minecraft 从 1.5 开始解析颜色代码的方式。通过对它们进行排序并重建消息,它不会依赖于用户或开发人员获得正确的顺序。

你可以使用稍微复杂一点的正则表达式得到你想要的东西

(((?:&|§)[0-9A-FK-ORa-fk-or])+)([^&]*)

分解一下,我们有两个重要的捕获组

 (((?:&|§)[0-9A-FK-ORa-fk-or])+)

这将捕获 and & 后跟一个字符的一个或多个代码段

([^&]*)

第二个抓取任意数量的非 & 字符,这将为您提供该部分的其余部分。 (这与您提供的正则表达式的行为略有不同 - 如果 & 是字符串中的合法字符,事情会更复杂。

将该正则表达式与匹配器一起使用,您可以执行以下操作,

  String input = "&l&aCheckpoint&m&6doreime";
    Pattern pattern = Pattern.compile("(((?:&|§)[0-9A-FK-ORa-fk-or])+)([^&]*)");
    Matcher patternMatcher = pattern.matcher(input);
    while(patternMatcher.find()){
        String[] codes = patternMatcher.group(1).split("(?=&)"); 
        String rest = patternMatcher.group(3); 
    }

这将循环两次,给你

  codes = ["&l", "&a"]
  rest = "Checkpoint"

第一个循环和第二个循环

  codes = ["&m", "&6"]
  rest = "doreime"