[解決済み】Java:カンマ区切りの文字列を分割するが、引用符の中のカンマは無視される
2022-04-03 01:44:41
質問
なんとなくこんな感じの文字列があります。
foo,bar,c;qual="baz,blurb",d;junk="quux,syzygy"
をカンマで分割したいのですが、引用符の中のカンマは無視したいのです。どうすればいいのでしょうか?正規表現によるアプローチは失敗のようです。手動でスキャンして、引用符を見たときに別のモードに入ることはできると思いますが、既存のライブラリを使用するのが良いでしょう。( 編集 : すでにJDKに含まれているライブラリや、Apache Commonsのような一般的に使われているライブラリの一部を指していたのだと思います)。
という文字列に分割されるはずです。
foo
bar
c;qual="baz,blurb"
d;junk="quux,syzygy"
をメモしてください。 これはCSVファイルではなく、より大きな全体構造を持つファイルに含まれる単一の文字列です。
解決するには?
試してみてください。
public class Main {
public static void main(String[] args) {
String line = "foo,bar,c;qual=\"baz,blurb\",d;junk=\"quux,syzygy\"";
String[] tokens = line.split(",(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)", -1);
for(String t : tokens) {
System.out.println("> "+t);
}
}
}
出力します。
> foo
> bar
> c;qual="baz,blurb"
> d;junk="quux,syzygy"
言い換えれば コンマの前に0個または偶数個の引用符がある場合のみ、コンマの上で分割されます。 .
あるいは、もう少し目に優しい。
public class Main {
public static void main(String[] args) {
String line = "foo,bar,c;qual=\"baz,blurb\",d;junk=\"quux,syzygy\"";
String otherThanQuote = " [^\"] ";
String quotedString = String.format(" \" %s* \" ", otherThanQuote);
String regex = String.format("(?x) "+ // enable comments, ignore white spaces
", "+ // match a comma
"(?= "+ // start positive look ahead
" (?: "+ // start non-capturing group 1
" %s* "+ // match 'otherThanQuote' zero or more times
" %s "+ // match 'quotedString'
" )* "+ // end group 1 and repeat it zero or more times
" %s* "+ // match 'otherThanQuote'
" $ "+ // match the end of the string
") ", // stop positive look ahead
otherThanQuote, quotedString, otherThanQuote);
String[] tokens = line.split(regex, -1);
for(String t : tokens) {
System.out.println("> "+t);
}
}
}
となり、最初の例と同じになります。
EDIT
コメントで@MikeFHayさんがおっしゃっている通りです。
を使うのが好きです。 グアバのスプリッタ は、より健全なデフォルトを持つため(空のマッチが
String#split()
ということで、そうしました。Splitter.on(Pattern.compile(",(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)"))
関連
-
[解決済み] JavaでInputStreamを読み込んでStringに変換するにはどうすればよいですか?
-
[解決済み] JavaでStringをintに変換するにはどうしたらいいですか?
-
[解決済み] Javaで文字列値からenum値を取得する方法
-
[解決済み] Javaで文字列を分割する方法
-
[解決済み] ファイルの内容からJavaの文字列を作成するにはどうすればよいですか?
-
[解決済み] Javaで「ArrayList<String>」を「String[]」に変換する。
-
[解決済み] IList<string> または IEnumerable<string> からカンマ区切りリストを作成する。
-
[解決済み] Java文字列→日付変換
-
[解決済み] カンマ区切りの文字列を配列に変換するにはどうすればよいですか?
-
[解決済み] カンマ区切りの文字列をリストに変換するには?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] 未処理の例外タイプIOException」が表示されるのですが?
-
[解決済み] Eclipse デフォルトのフォント名
-
[解決済み] ボタンでTextFieldをクリアする(Java)
-
[解決済み] Eclipse- Dynamic Web Module 3.0 で新しいプロジェクトを作成するときに Java 1.6 以降が必要なエラーが発生する。
-
[解決済み] ORA-01654: インデックスを拡張できません。
-
[解決済み] 1行目2列目でBEGIN_ARRAYを期待したが、BEGIN_OBJECTだった。
-
[解決済み] eclipseからTomcatに物理的に発行されるmyjspはどこにあるのでしょうか?
-
[解決済み] 文字列が一意な文字であるかどうかを判定する
-
[解決済み] スリーピング中のスレッドが割り込まれ、データベースへの接続が失われる
-
[解決済み] java swingアプリケーションでJCEがプロバイダBCを認証できない