• ベストアンサー

splitメソッドで"で囲まれていないカンマのみで区切ることは可能でし

splitメソッドで"で囲まれていないカンマのみで区切ることは可能でしょうか。 現在質問している別の質問と関連するのですが、下記のように"で囲まれていない カンマのみを区切り文字にするような正規表現はありますでしょうか。 例)123,"abc",456,",",",,"を分解  123  "abc"  456  ","  ",," 「括弧で囲まれている」であれば「".*,.*"」などはどうだろうかと思ったのですが、 囲まれていないという表現が思いつきませんでした。 よろしければアドバイスを頂けないでしょうか。

質問者が選んだベストアンサー

  • ベストアンサー
  • nda23
  • ベストアンサー率54% (777/1415)
回答No.1

一発でやるのは難しいでしょう。 文字列には二重引用符とカンマが混在する可能性があり、 最短一致でも最長一致でもペアの引用符を検出する手が ありません。 そこで、手順として次のようにしたら如何でしょう? (1)引用符内のカンマを別の字(非表現可能文字)にする。 (2)カンマで区切る。 (3)各要素に対し、「別の字」をカンマに変換する。 (4)各要素に対し、先頭と末尾の引用符を除去する。 (5)各要素に対し、連続する引用符を1個の引用符にする。 String t = "123,\"abc\",~"; //対象文字列 Pattern p = Pattern.compile("\"(.*?)\""); //引用符内を得る正規表現 Matcher m = p.matcher(t); //一致箇所の検索 m.reset(); //検索開始点を先頭にする String r = ""; //変換後の文字列 int z = 0; //最初の位置 while( m.find() ) {     int x = m.groupCount();     for ( int i = 0 ; i < x ; i++ ) {         String w = m.group(i); //引用符内の文字列         r += t.substring(z, m.start(i)); //直前までを合成         w = w.replaceAll(",", "\u0000"); //カンマを変換         r += w; //検索部分を繋げる         z = m.end(i); //直後の位置を記録     } } String[] a = r.split(","); //カンマで区切る for ( int i = 0 ; i < a.length ; i++ ) {     a[i] = a[i].replaceAll("\u0000", ","); //カンマに戻す     a[i] = a[i].replaceAll("^\"|\"$", ""); //先頭と末尾の"を除去     a[i] = a[i].replaceAll("\"\"", "\""); //二重引用符の処理 }

_alias_
質問者

お礼

申し訳ありません。お返事が遅れしまいました。 有難うございました。

関連するQ&A