How to split string but keep delimiters in java?
As from your input string and expected results, I can infer that you want to split your string basically from three rules.
- Split from the point which is preceded and followed by a colon
- Split from the point which is preceded by a space and followed by a colon
- Split from the point which is preceded by a colon and followed by a space
Hence you can use this regex using alternations for all three cases mentioned above.
(?<=:)(?=:)|(?<= )(?=:)|(?<=:)(?= )
Regex Demo
Java code,
String s = "Hello, :smile::hearth: world!";
System.out.println(Arrays.toString(s.split("(?<=:)(?=:)|(?<= )(?=:)|(?<=:)(?= )")));
Prints like your expected output,
[Hello, , :smile:, :hearth:, world!]
Also, as an alternative if you can use matching the text rather than split, the regex would be much simpler to use and it would be this,
:[^:]+:|\S+
Regex Demo using match
Java code,
String s = "Hello, :smile::hearth: world!";
Pattern p = Pattern.compile(":[^:]+:|\\S+");
Matcher m = p.matcher(s);
while(m.find()) {
System.out.println(m.group());
}
Prints,
Hello,
:smile:
:hearth:
world!