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?