java - 使用多个模式拆分字符串,其中第二个模式匹配第一个模式的较小部分
问题描述
我正在读取字符串中的特殊“格式代码”并尝试拆分字符串,以便将这些格式代码和字符串的文本分开。
格式代码有两种“类型”:“编码”十六进制颜色:§x§7§3§7§5§f§f
和其他格式为§r
.
给定示例字符串:§x§7§3§7§5§f§f§ltest1 §rtest2
我需要将较大的模式拆分为一个整体,然后再拆分较小的模式。我可以分别对这些模式做我想做的事情,但是在将它们组合成一个正则表达式时遇到了麻烦。因为第二个模式匹配第一个模式的片段,所以它只是将所有内容分成更小的组。
我正在尝试这个:
for (String substr : "§x§7§3§7§5§f§f§ltest1 §rtest2".split("((?<=(§x(§[0-9a-f]){6}))|(?<=§[0-9a-z])|(?=§[0-9a-z]))")) {
System.out.println(substr);
}
我的预期输出是:
§x§7§3§7§5§f§f
§l
test1
§r
test
我的实际输出是:
§x
§7
§3
§7
§5
§f
§f
§l
test1
§r
test2
当我将表达式分成不同的split
测试时,它们可以工作,但它们不能一起工作。
解决方案
您可以使用这个简化的正则表达式进行匹配,而不是拆分:
§x(?:§[0-9a-f]){6}|§[0-9a-z]|[^§\s]+
正则表达式详细信息:
§x(?:§[0-9a-f]){6}
§x
: 匹配以和 6 个十六进制字符开头的文本|
: 或者§[0-9a-z]
§
: 匹配以和字母数字开头的文本|
: 或者[^§\s]+
: 匹配 1+ 个非空白和非§
字符
代码:
final String regex = "§x(?:§[0-9a-f]){6}|§[0-9a-z]|[^§\\s]+";
final String string = "§x§7§3§7§5§f§f§ltest1 §rtest2";
final Pattern pattern = Pattern.compile(regex);
final Matcher matcher = pattern.matcher(string);
while (matcher.find()) {
System.out.println( matcher.group(0) );
}
推荐阅读
- javascript - 放入双重事件监听器时,事件数量增加三倍?
- c - 我想知道为什么这不起作用(函数定义外部主函数和内部主函数)
- neural-network - 如何在 MNIST 训练的网络上测试我自己的图像?
- asp.net-core-mvc - 没有给出与“Interface.Create(Trademark, IFormFile)”所需的形式参数“photo”相对应的参数?
- apache-kafka - 是否有开源 Kafka Cassandra 连接器配置的示例?
- javascript - 如何使用扩展语法将新元素推送到 JavaScript 中的嵌套对象数组
- permissions - Rsync 未在目标目录上设置 SGID 位
- django - 如何在 django 的管理面板中存储用户提出的投诉
- java - 有没有一种方法可以让我无需在 android 中打开网站就可以在点击按钮时访问 url?
- javascript - 无法更改antd V4选择后缀图标,同时打开选项列表