似乎无法通过新行正则表达式拆分字符串



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

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. 文件配置 - 为简化 YAML 配置文件的使用而创建的类。
  2. 字符串 - 消息的键(可以使用"."进行索引,"."的任一侧表示 YAML 文件的不同级别)。
  3. 布尔值 - 字符串中的保留字符是否应转换为彩色字符(颜色只能由客户端看到)
  4. 对象... - 一些模式等)<名称>将替换为数组中的以下值。

这是不起作用的代码块。最初,我尝试将正则表达式设置为n,但这没有返回列表。我认为这是因为它正在搜索已经解析的新行而不是""字符流。所以我将我的正则表达式更改为 ,但仍然不起作用。我在互联网上搜索,在这篇文章中发现我应该使用正则表达式\r\n以及\n因为r用于 Windows 系统。这又不起作用,我一直得到 1 个字符串,里面还有 。

原因如下。

正则表达式有自己的转义序列,用\(的转义序列)表示,因为Java保留了

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

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

例:

System.out.println(Arrays.toString("Hello\nworld".split("\\n")));
System.out.println(Arrays.toString("Hello worldnwith newline".split("\n")));
System.out.println(Arrays.toString("Hello worldnwith 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'tnsplit]

此外,要处理所有三种行端类型(尽管现在单独r并不常见),请改用正则表达式\\r?\\n|\\r

最新更新