Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Split with single colon but not double colon using regex

I have a string like this

"yJdz:jkj8h:jkhd::hjkjh"

I want to split it using colon as a separator, but not a double colon. Desired result:

("yJdz", "jkj8h", "jkhd::hjkjh")

I'm trying with:

re.split(":{1}", "yJdz:jkj8h:jkhd::hjkjh")

but I got a wrong result.

In the meanwhile I'm escaping "::", with string.replace("::", "$$")

like image 545
Ruggero Turra Avatar asked Sep 17 '10 13:09

Ruggero Turra


1 Answers

You could split on (?<!:):(?!:). This uses two negative lookarounds (a lookbehind and a lookahead) which assert that a valid match only has one colon, without a colon before or after it.

To explain the pattern:

(?<!:)  # assert that the previous character is not a colon
:       # match a literal : character
(?!:)   # assert that the next character is not a colon

Both lookarounds are needed, because if there was only the lookbehind, then the regular expression engine would match the first colon in :: (because the previous character isn't a colon), and if there was only the lookahead, the second colon would match (because the next character isn't a colon).

like image 173
Daniel Vandersluis Avatar answered Sep 30 '22 05:09

Daniel Vandersluis