如何拆分字符串但在java中保留分隔符? [复制]

Posted

技术标签:

【中文标题】如何拆分字符串但在java中保留分隔符? [复制]【英文标题】:How to split string but keep delimiters in java? [duplicate] 【发布时间】:2019-10-03 00:17:39 【问题描述】:

我正在尝试重新创建 discord 解析带有表情符号的消息的方式。

例如,我想将消息Hello, :smile::hearth: world!拆分成如下数组:

["Hello, ", ":smile:", ":hearth:", " world!"]

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

Arrays.toString(message.split("(:[A-Za-z]+:)"))

但是,split 方法会删除找到的分隔符。所以最终的结果是这样的:

["Hello", , , " world!"]

【问题讨论】:

你可以试试这个正则表达式[\s+],用空格分割它,它会解决。 @Sambit 我想在不使用空格时也拆分它。 为了让这个问题得到回答,您需要在问题中包含一个简短但完整的代码示例,reproduces the problem 您在问题中描述了该示例。 @RobertHarvey 我已经更新了问题。 【参考方案1】:

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

从冒号前后的点分割 从前面有一个空格,后面有一个冒号的点分割 从前面有一个冒号,后面跟一个空格的点分割

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

(?<=:)(?=:)|(?<= )(?=:)|(?<=:)(?= )

Regex Demo

Java 代码,

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

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

[Hello, , :smile:, :hearth:,  world!]

另外,如果您可以使用匹配文本而不是拆分,则作为替代方法,正则表达式会更简单使用,就是这样,

:[^:]+:|\S+

Regex Demo using match

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());

打印,

Hello,
:smile:
:hearth:
world!

【讨论】:

这正是我想要的!我知道这是可能的,但看不到解决方案。我也不知道Pattern#compile,所以今天又学到了一点!非常感谢!【参考方案2】:

请使用正则表达式的 Lookahead ,Lookbehind 以获得预期的结果。请参考下面的代码sn-p到

 public static void main(String[] args) 
       String message= "Hello, :smile::hearth: world!"; 
       System.out.println(Arrays.toString(message.split("(?=,)|(?=(?!)::)|(?<=(:[A-Za-z]+:))")));


    

这将输出为 [你好,:微笑:,:壁炉:,世界!]

【讨论】:

以上是关于如何拆分字符串但在java中保留分隔符? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

java - 如何拆分字符串,同时保留分隔符?

如何使用分隔符数组在 Java 中使用多个分隔符拆分字符串? [复制]

在 Python 中,如何拆分字符串并保留分隔符?

Java Regex在分隔符和保留分隔符之间拆分字符串[重复]

Java - 正则表达式拆分输入文本但保留分隔符[重复]

如何在python中拆分具有多个分隔符的字符串? [复制]