似乎无法通过新行正则表达式拆分String

时间:2017-04-14 14:19:35

标签: java regex string newline bukkit

我有这个方法,它不会正确地将拆分字符串添加到我的列表中。

public static List<String> formatConfigMessages(FileConfiguration config, String key, boolean colour, Object... regex) {
    List<String> messages = new ArrayList<>();
    if (config.isList(key)) {
        config.getStringList(key).forEach(message -> {
            if (message.contains("\\n")) {
                Collections.addAll(messages, message.split("\\r\\n|\\n|\\r"));
            } else {
                messages.add(message);
            }
        });
    } else {
        String message = config.getString(key);
        if (message.contains("\\n")) {
            Collections.addAll(messages, message.split("\\r\\n|\\n|\\r"));
        } else {
            messages.add(message);
        }
    }
    return messages.stream().map(message -> formatMessage(message, colour, regex)).collect(Collectors.toList());
}

对于一些上下文,此方法用于格式化SpigotMC插件的可配置消息。该方法需要4个参数:

  1. FileConfiguration - 用于简化YAML配置文件使用的类。
  2. String - 消息的键(可以用'。'索引,'。'的任一侧代表YAML文件的不同级别。)
  3. Boolean - 字符串中的保留字符是否应转换为彩色字符(颜色只能由客户端查看)
  4. 对象...... - 某些模式等)&lt; name&gt;要替换为数组中的以下值。
  5. 这是不起作用的代码块。最初,我尝试将正则表达式设置为\n,但是没有返回列表。我认为这是因为它正在搜索已解析的新行而不是'\ n'字符流。所以我把我的正则表达式改为\ n,但仍然没有用。我在互联网上搜索并在this post中找到我应该使用正则表达式\\r\\n以及\\n因为\r用于Windows系统。这再次没有用,我一直在里面继续获得1个字符串。

1 个答案:

答案 0 :(得分:1)

这就是原因。

Regex有自己的转义序列,用\\表示(\的转义序列),因为Java保留\

例如,\\w表示单词中的任何字符。

要按&#34; \ n&#34;拆分,您需要\\\\n,因为正则表达式中的\\n表示实际的换行符,就像\n一样代表Java中的一个。

示例:

System.out.println(Arrays.toString("Hello\\nworld".split("\\\\n")));
System.out.println(Arrays.toString("Hello world\nwith newline".split("\\n")));
System.out.println(Arrays.toString("Hello world\nwith newline".split("\n")));
System.out.println(Arrays.toString("I won't\\nsplit".split("\\n")));

打印:

[Hello, world]
[Hello world, with newline]
[Hello world, with newline] <-- Same effect as above
[I won't\nsplit]

Additionally, to handle all three line end types(虽然\r本身并不常见),但请使用正则表达式\\\\r?\\\\n|\\\\r