Regex to pick characters outside of pair of quotes

Viewed 34369

I would like to find a regex that will pick out all commas that fall outside quote sets.

For example:

'foo' => 'bar',
'foofoo' => 'bar,bar'

This would pick out the single comma on line 1, after 'bar',

I don't really care about single vs double quotes.

Has anyone got any thoughts? I feel like this should be possible with readaheads, but my regex fu is too weak.

6 Answers

This will match any string up to and including the first non-quoted ",". Is that what you are wanting?

/^([^"]|"[^"]*")*?(,)/

If you want all of them (and as a counter-example to the guy who said it wasn't possible) you could write:

/(,)(?=(?:[^"]|"[^"]*")*$)/

which will match all of them. Thus

'test, a "comma,", bob, ",sam,",here'.gsub(/(,)(?=(?:[^"]|"[^"]*")*$)/,';')

replaces all the commas not inside quotes with semicolons, and produces:

'test; a "comma,"; bob; ",sam,";here'

If you need it to work across line breaks just add the m (multiline) flag.

Try this regular expression:

(?:"(?:[^\\"]+|\\(?:\\\\)*[\\"])*"|'(?:[^\\']+|\\(?:\\\\)*[\\'])*')\s*=>\s*(?:"(?:[^\\"]+|\\(?:\\\\)*[\\"])*"|'(?:[^\\']+|\\(?:\\\\)*[\\'])*')\s*,

This does also allow strings like ā€œ'foo\'bar' => 'bar\\',ā€.

Related