正規表現でCSVをパース

正規表現でCSVをパースする。CSVの条件は

  • 全ての値はダブルクォート"で囲まれており、値内のダブルクォートはエスケープされている
  • 各値はカンマ,で区切られており、区切りの前後にスペースはない

で、正規表現は

"(.*?(?<!\\))",?

となる。これは、以下のような例にヒットする。

"a"
"a","b","c"
"\"a","b\"","\"c\""
",a","b,",",c,"

Javaでの例は以下の通り。

Pattern pattern = Pattern.compile("\"(.*?(?<!\\\\))\",?");
Matcher matcher = pattern.matcher(CSV_STRING);
while (matcher.find()) {
    System.out.println(matcher.group(1));
}