🎉

Javaでよくやる文字列操作

に公開

思いついたものがあったら追記します。

環境

JDK 17

参考資料

StringクラスのJavadoc

部分文字列を取得する

終了インデックスの文字は含まれないことに注意。

String source = "abcdefghijk";
// 開始インデックス(=0始まり)のみ指定。開始インデックスの文字は含まれる
String sub1 = source.substring(3);
System.out.println(sub1);
// 開始インデックス(=0始まり)と終了インデックスを指定。
// 開始インデックスの文字は含まれる。終了インデックスの文字は含まれない。
String sub2 = source.substring(3, 6);
System.out.println(sub2);
実行結果
defghijk
def

CSV文字列を分割する(囲み文字無し)

コード
String source  = "aaa,bbb,ccc";
String[] result = source.split(",");
for (String s : result) {
    System.out.println(s);
}
実行結果
aaa
bbb
ccc

CSV文字列を分割する(囲み文字あり)

'aaa','bbb','ccc'からaaabbbcccが欲しい場合。

一番最初と最後の'を削除してから、','で分割するのがポイントです。

コード
String source  = "'aaa','bbb','ccc'";
// 最初と最後の'を取り除く
String substring = source.substring(1, source.length() - 1);
// ','で分割する
String[] result = substring.split("','");
for (String s : result) {
    System.out.println(s);
}
実行結果
aaa
bbb
ccc

結合してCSV文字列を作成する(囲み文字無し)

配列で指定
String[] source = {"aaa", "bbb", "ccc"};
String result = String.join(",", source);
System.out.println(result);
可変長引数で指定
String result = String.join(",", "aaa", "bbb", "ccc");
System.out.println(result);
Listで指定
List<String> source = List.of("aaa", "bbb", "ccc");
String result = String.join(",", source);
System.out.println(result);
Stream_APIを利用
List<String> source = List.of("aaa", "bbb", "ccc");
String result = source.stream()
    .collect(Collectors.joining(","));
System.out.println(result);
実行結果(全て同じ)
aaa,bbb,ccc

結合してCSV文字列を作成する(囲み文字あり)

List<String> source = List.of("aaa", "bbb", "ccc");
String result = source.stream()
    // 「区切り文字,最初の文字,最後の文字」の順に指定
    .collect(Collectors.joining("','", "'", "'"));
System.out.println(result);
実行結果
'aaa','bbb','ccc'

文字列の置換

String source = "おいしいいちごをたべたい";
String result = source.replace("い", "あ");
// 元の文字列は変更されないことに注意
System.out.println(source);
System.out.println(result);
実行結果
おいしいいちごをたべたい
おあしああちごをたべたあ

似たメソッドでreplaceAll()replaceFirst()というものがあります。これらは置換対象を正規表現で指定します。対して👆のreplace()は単純な文字列一致で置換対象を指定します。

変数の埋め込み

%dは整数、%sは文字列です。

String source = """
    本日の気温は%d度です。
    これは%sです。
    """;
int temperature = 30;
String expression = "夏日";
String result = source.formatted(temperature, expression);
System.out.println(result);
実行結果
本日の気温は30度です。
これは真夏日です。
  • String.format(source, temperature, expression)でも全く同じことができます。しかし、Java 15で導入された.formatted()メソッドの方が読みやすいので、最近のJavaではこちらをよく使います。
  • Java 21では変数を直接埋め込むことができるようになるみたいです(JEP 430)。

文字コード変換(UTF-8 -> Shift-JIS)

TBD

文字コード変換(Shift-JIS -> UTF-8)

TBD

Discussion