【问题标题】:Matching and sorting a Bukkit ChatColor expression匹配和排序 Bukkit ChatColor 表达式
【发布时间】:2016-04-25 16:19:34
【问题描述】:

我用空格分割一个字符串,然后检查每个部分是否包含代码(&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 组(它将每个代码段 (&amp;[0-9A-FK-ORa-fk-or]) 和剩余的文本拆分到另一个代码段?

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

【问题讨论】:

    标签: java regex regex-lookarounds


    【解决方案1】:

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

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

    我们有两个重要的捕获组

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

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

    ([^&]*)
    

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

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

      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"
    

    【讨论】:

    • 当您使用(?=&amp;) 拆分代码时,如何使用&amp; 中的1 个或2 个拆分代码。例如:&amp;&amp;l&amp;&amp;a&amp;mCheckpoint 将显示[&amp;, &amp;l, &amp;, &amp;a, &amp;m] 作为代码,但我想要[&amp;&amp;l, &amp;&amp;a, &amp;m]
    • 如果你想这样做,你可以在主正则表达式中使 & 后面的字符可选,即(((?:&amp;|§)[0-9A-FK-ORa-fk-or]?)+)([^&amp;]*)(注意字符匹配后的 ?)这将使&amp;&amp;l&amp;&amp;a&amp;mCheckpoint 显示@ 987654334@
    • 我将代码拆分正则表达式切换为负后向 (?&lt;!&amp;),它实现了我想要的。感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 2015-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-26
    • 2022-12-11
    • 2013-12-26
    • 2019-08-25
    相关资源
    最近更新 更多