匹配和排序 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"
我按空格拆分一个字符串,然后检查每个部分是否包含代码(&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"