How to split a string, but also keep the delimiters?

java, regex

Solution

You can use lookahead and lookbehind, which are features of regular expressions.

System.out.println(Arrays.toString("a;b;c;d".split("(?<=;)")));
System.out.println(Arrays.toString("a;b;c;d".split("(?=;)")));
System.out.println(Arrays.toString("a;b;c;d".split("((?<=;)|(?=;))")));

And you will get:

[a;, b;, c;, d]
[a, ;b, ;c, ;d]
[a, ;, b, ;, c, ;, d]

The last one is what you want.

`((?<=;)|(?=;))` equals to select an empty character before `;` or after `;`.

EDIT: Fabian Steeg's comments on readability is valid. Readability is always a problem with regular expressions. One thing I do to make regular expressions more readable is to create a variable, the name of which represents what the regular expression does. You can even put placeholders (e.g. `%1$s`) and use Java's `String.format` to replace the placeholders with the actual string you need to use; for example:

static public final String WITH_DELIMITER = "((?<=%1$s)|(?=%1$s))";

public void someMethod() {
    final String[] aEach = "a;b;c;d".split(String.format(WITH_DELIMITER, ";"));
    ...
}

Problem

I have a multiline string which is delimited by a set of different delimiters: ``` (Text1)(DelimiterA)(Text2)(DelimiterC)(Text3)(DelimiterB)(Text4) ``` I can split this string into its parts, using `String.split`, but it seems that I can't get the actual string, which matched the delimiter regex. In other words, this is what I get: - `Text1` - `Text2` - `Text3` - `Text4` This is what I want - `Text1` - `DelimiterA` - `Text2` - `DelimiterC` - `Text3` - `DelimiterB` - `Text4` Is there any JDK way to split the string using a delimiter regex but also keep the delimiters?

Original source

Related problems