5

I have a string like hello, "darkness, my", (old, friend) and I want this splitted result:
hello
"darkness, my"
(old, friend)

I found a way to ignore the commas in "-marks (,?=([^\"]*\"[^\"]*\")*[^\"]*$) and another way to ignore the commas in brackets (,(?=[^\\)]*(?:\\(|$))).
When I use the first, I get:
hello
"darkness, my"
(old
friend)
And when I use the second, I get:
hello
"darkness
my"
(old, friend)

But how do I combine these two solutions?

Selphiron
  • 897
  • 1
  • 12
  • 30
  • 3
    Variation of [**The best regex trick ever**](http://www.rexegg.com/regex-best-trick.html) - scroll down to the `Java` section. – Jan Nov 23 '16 at 17:40
  • 2
    You can always use both tests... `,(?=...)(?=...)`. Or to make your life simpler don't use split which describes delimiters, use `Matcher#find` and describe tokens which you are interested in `any words` OR `"text between quotes"` OR `(text between parenthesis)`. Or maybe even better don't use regex at all. Simply iterate over characters and pay attention to comma which is outside of parenthesis or quotes like https://stackoverflow.com/questions/12756651/split-a-string-based-on-regex/12756948#12756948 – Pshemo Nov 23 '16 at 17:49
  • Thanks both of you. It is for a very small thing so I just used both tests as @Pshemo suggested and it worked – Selphiron Nov 23 '16 at 17:57
  • did you get right answer? – payam_sbr Nov 23 '16 at 18:02
  • @payamsbr I think so. It did not raise any exceptions and the data looks ok. I need to double check some of the data to be sure. Do you think that it should not work because of a mistake? – Selphiron Nov 23 '16 at 18:08

1 Answers1

3

Probably easier to match the parts, rather than splitting them.

\s*("[^"]*"|\([^)]*\)|[^,]+)

This will capture each piece of data as group 1.

Whothehellisthat
  • 2,072
  • 1
  • 14
  • 14
  • thanks that worked. The other solution was to use both tests `,(?=...)(?=...)` as @Pshemo suggested but this is approach also works. Thanks – Selphiron Nov 23 '16 at 22:28