Java split is eating my characters

java, regex, split, string

Solution

Use zero-width matching assertions:

    String str = "la$le\\$li$lo";
    System.out.println(java.util.Arrays.toString(
        str.split("(?<!\\\\)\\$")
    )); // prints "[la, le\$li, lo]"

The regex is essentially

(?<!\\)\$

It uses negative lookbehind to assert that there is not a preceding `\`.

See also

- regular-expressions.info/Lookarounds

More examples of splitting on assertions

Simple sentence splitting, keeping punctuation marks:

    String str = "Really?Wow!This.Is.Awesome!";
    System.out.println(java.util.Arrays.toString(
        str.split("(?<=[.!?])")
    )); // prints "[Really?, Wow!, This., Is., Awesome!]"

Splitting a long string into fixed-length parts, using `\G`

    String str = "012345678901234567890";
    System.out.println(java.util.Arrays.toString(
        str.split("(?<=\\G.{4})")
    )); // prints "[0123, 4567, 8901, 2345, 6789, 0]"

Using a lookbehind/lookahead combo:

    String str = "HelloThereHowAreYou";
    System.out.println(java.util.Arrays.toString(
        str.split("(?<=[a-z])(?=[A-Z])")
    )); // prints "[Hello, There, How, Are, You]"

Related questions

- Can you use zero-width matching regex in String split?

- Backreferences in lookbehind

- How do I convert CamelCase into human-readable names in Java?

Problem

I have a string like this `String str = "la$le\\$li$lo"`. I want to split it to get the following output `"la","le\\$li","lo"`. The \$ is a $ escaped so it should be left in the output. But when I do `str.split("[^\\\\]\\$")` y get `"l","le\\$l","lo"`. From what I get my regex is matching a$ and i$ and removing then. Any idea of how to get my characters back? Thanks

Original source

Related problems