jwmajors81
jwmajors81

Reputation: 1430

RegEx Split on / Except when Surrounded by []

I am trying to split a string in Java on / but I need to ignore any instances where / is found between []. For example if I have the following string

/foo/bar[donkey=King/Kong]/value

Then I would like to return the following in my output

I have seen a couple other similar posts, but I haven't found anything that fits exactly what I'm trying to do. I've tried the String.split() method and as follows and have seen weird results:

Code:  value.split("/[^/*\\[.*/.*\\]]")

Result:  [, oo, ar[donkey=King, ong], alue]

What do I need to do in order to get back the following:

Desired Result:  [, foo, bar[donkey=King/Kong], value]

Thanks, Jeremy

Upvotes: 3

Views: 113

Answers (2)

EdgeCase
EdgeCase

Reputation: 4827

Of the following string, the regex below will match foo and bar, but not fox and baz, because they're followed by a close bracket. Study up on negative lookahead.

fox]foo/bar/baz]

Regex:

\b(\w+)\b(?!])

Upvotes: 0

Rohit Jain
Rohit Jain

Reputation: 213311

You need to split on the / followed by an 0 or more balanced pairs of brackets:

String str = "/foo/bar[donkey=King/Kong]/value";

String[] arr = str.split("/(?=([[^\\[\\]]*\\[[^\\[\\]]*\\])*[^\\[\\]]*$)");     
System.out.println(Arrays.toString(arr));

Output:

[, foo, bar[donkey=King/Kong], value]

More User friendly explanation

String[] arr = str.split("(?x)/"        +   // Split on `/`
                     "(?="              +   // Followed by
                     "  ("              +   // Start a capture group
                     "     [^\\[\\]]*"  +   // 0 or more non-[, ] character
                     "      \\["        +   // then a `[`
                     "     [^\\]\\[]*"  +   // 0 or more non-[, ] character
                     "     \\]"         +   // then a `]`
                     "  )*"             +   // 0 or more repetition of previous pattern
                     "  [^\\[\\]]*"     +   // 0 or more non-[, ] characters 
                     "$)");                 // till the end

Upvotes: 2

Related Questions