首页 > 解决方案 > 使用多个模式拆分字符串,其中第二个模式匹配第一个模式的较小部分

问题描述

我正在读取字符串中的特殊“格式代码”并尝试拆分字符串,以便将这些格式代码和字符串的文本分开。

格式代码有两种“类型”:“编码”十六进制颜色:§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测试时,它们可以工作,但它们不能一起工作。

标签: javaregex

解决方案


您可以使用这个简化的正则表达式进行匹配,而不是拆分:

§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) );
}

推荐阅读