如何在Java中拆分字符串但保留定界符?

Tje*_*len 6 java regex

我正在尝试重新创建不和谐的表情符号解析消息的方式。

例如,我希望消息Hello, :smile::hearth: world!拆分为以下数组:

["Hello, ", ":smile:", ":hearth:", " world!"]
Run Code Online (Sandbox Code Playgroud)

我已经尝试使用以下代码拆分数组:

Arrays.toString(message.split("(:[A-Za-z]+:)"))
Run Code Online (Sandbox Code Playgroud)

但是,split方法会删除找到的定界符。因此最终结果如下所示:

["Hello", , , " world!"]
Run Code Online (Sandbox Code Playgroud)

Pus*_*shi 7

根据您输入的字符串和预期结果,我可以推断出您基本上想从三个规则中拆分字符串。

  • 从冒号的前后分开
  • 从前面加一个空格和一个冒号的点开始分裂
  • 从冒号前面加空格的点开始分裂

因此,您可以对上述所有三种情况使用交替使用此正则表达式。

(?<=:)(?=:)|(?<= )(?=:)|(?<=:)(?= )
Run Code Online (Sandbox Code Playgroud)

正则表达式演示

Java代码

String s = "Hello, :smile::hearth: world!";
System.out.println(Arrays.toString(s.split("(?<=:)(?=:)|(?<= )(?=:)|(?<=:)(?= )")));
Run Code Online (Sandbox Code Playgroud)

像您的预期输出一样打印,

[Hello, , :smile:, :hearth:,  world!]
Run Code Online (Sandbox Code Playgroud)

另外,作为替代方案,如果您可以使用匹配文本而不是分割文本,则正则表达式将更易于使用,就是这样,

:[^:]+:|\S+
Run Code Online (Sandbox Code Playgroud)

使用匹配的正则表达式演示

Java代码

String s = "Hello, :smile::hearth: world!";
Pattern p = Pattern.compile(":[^:]+:|\\S+");
Matcher m = p.matcher(s);
while(m.find()) {
    System.out.println(m.group());
}
Run Code Online (Sandbox Code Playgroud)

印刷品

Hello,
:smile:
:hearth:
world!
Run Code Online (Sandbox Code Playgroud)