txt = "a,s(d,f(4,5)),g,h" pattern = Regexp.new('((?:[^,(]+|(\((?>[^()]+|\g<-1>)*\)))+)') puts txt.scan(pattern).map &:first ( # first capturing group (?: # open a non capturing group [^,(]+ # all characters except , and ( | # or ( # open the second capturing group \( # ( (?> # open an atomic group [^()]+ # all characters except parenthesis | # OR \g<-1> # the last capturing group (you can also write \g<2>) )* # close the atomic group \) # ) ) # close the second capturing group )+ # close the non-capturing group and repeat it ) # close the first capturing group
Preview:
downloadDownload PNG
downloadDownload JPEG
downloadDownload SVG
Tip: You can change the style, width & colours of the snippet with the inspect tool before clicking Download!
Click to optimize width for Twitter