我有这个方法,它不会正确地将拆分字符串添加到我的列表中。
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个参数:
这是不起作用的代码块。最初,我尝试将正则表达式设置为\n
,但是没有返回列表。我认为这是因为它正在搜索已解析的新行而不是'\ n'字符流。所以我把我的正则表达式改为\ n,但仍然没有用。我在互联网上搜索并在this post中找到我应该使用正则表达式\\r\\n
以及\\n
因为\r
用于Windows系统。这再次没有用,我一直在里面继续获得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
。