I am trying to split a comma separated string using regex.

var a = 'hi,mr.007,bond,12:25PM'; //there are no white spaces between commas var b = /(\S+?),(?=\S|$)/g; b.exec(a); // does not catch the last item. 

Any suggestion to catch all the items.

1

3 Answers

Use a negated character class:

/([^,]+)/g 

will match groups of non-commas.

< a = 'hi,mr.007,bond,12:25PM' > "hi,mr.007,bond,12:25PM" < b=/([^,]+)/g > /([^,]+)/g < a.match(b) > ["hi", "mr.007", "bond", "12:25PM"] 
3

Why not just use .split?

>'hi,mr.007,bond,12:25PM'.split(',') ["hi", "mr.007", "bond", "12:25PM"] 

If you must use regex for some reason:

str.match(/(\S+?)(?:,|$)/g) ["hi,", "mr.007,", "bond,", "12:25PM"] 

(note the inclusion of commas).

If you are passing a CSV file, some of your values may have got double-quotes around them, so you may need something a little more complicated. For example:

Pattern splitCommas = java.util.regex.Pattern.compile("(?:^|,)((?:[^\",]|\"[^\"]*\")*)"); Matcher m = splitCommas.matcher("11,=\"12,345\",ABC,,JKL"); while (m.find()) { System.out.println( m.group(1)); } 

or in Groovy:

java.util.regex.Pattern.compile('(?:^|,)((?:[^",]|"[^"]*")*)') .matcher("11,=\"12,345\",ABC,,JKL") .iterator() .collect { it[1] } 

This code handles:

  • blank lines (with no values or commas on them)
  • empty columns, including the last column being empty
  • handles values wrapped in double-quotes, including commas inside the double-quotes
  • but does not handle two double-quotes used for escaping a double quote-itself

The pattern consists of:

  • (?:^|,) matches the start of the line or a comma after the last column, but does not add that to the group

  • ((?:[^",]|"[^"]*")*) matches the value of the column, and consists of:

    • a collecting group, which collects zero or more characters that are:

      • [^",] is a character that's not a comma or a quote
      • "[^"]*" is a double-quote followed by zero or more other characters ending in another double-quote
    • those are or-ed together, using a non-collecting group: (?:[^",]|"[^"]*")

    • use a * to repeat the above any number of times: (?:[^",]|"[^"]*")*
    • and into a collecting group to give the columns value: ((?:[^",]|"[^"]*")*)

Doing escaping of double quotes is left as an exercise to the reader

Your Answer

Sign up or log in

Sign up using Google Sign up using Facebook Sign up using Email and Password

Post as a guest

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy