JavaのString.splitでピリオド分割できない理由を正規表現から解説する記事のアイキャッチ。

Java クイズ

JavaのString.split(".")で分割できない理由|ピリオドを正規表現で扱う方法

AIによる要約

String.splitの引数は単なる区切り文字ではなく正規表現です。正規表現のピリオドは任意の1文字を表すため、split(".")では文字列全体が区切りとして扱われます。ピリオドそのもので分割するならsplit("\\.")、区切り文字が変数ならPattern.quoteを使います。また、末尾の空項目を残すには第2引数へ-1を指定します。

この記事はXへ投稿したJavaクイズの詳しい解説です。まず問題を解きたい方は、Xの元ポストを開くことができます。

新人SE
新人SE
a.bをピリオドで分けたいだけなのに、split(".")の結果が空になるのはなぜですか?
ポンコツSE
ポンコツSE
splitは正規表現を受け取ります。ピリオドは特別な意味を持つため、文字として扱う指定が必要です。

画面入力、ファイル名、バージョン番号、外部システムの連携項目など、区切り文字で文字列を分ける処理は業務システムでも頻繁に登場します。見た目が単純なため、そのままsplitへ渡して動作確認だけで終わらせがちです。

しかし、区切り文字がピリオド、縦棒、プラス、丸括弧などの場合は、正規表現の記号として解釈されます。さらに末尾の空項目が消える仕様もあるため、正常データだけでは気付かず、本番の一部データだけ列数がずれることがあります。

この記事のポイント

  • splitの引数は正規表現として解釈される
  • ピリオドそのものは\\.で表す
  • 変数の区切り文字にはPattern.quoteを使える
  • 末尾の空要素を残すならsplit(regex, -1)を使う
  • CSVの解析をsplitだけで実装しない

まずはXのJavaクイズを確認する

文字列a.bをピリオドでsplitした配列の長さを問うJavaクイズ画像。
この配列の要素数は2、1、0のどれでしょうか。
String[] parts = "a.b".split(".");
System.out.println(parts.length);

答えは0です。ピリオドがa、ピリオド、bの各文字に一致し、分割後にできた空要素は標準のsplitでは末尾から削除されます。

String.splitのピリオドは正規表現の任意の1文字になり、答えは0と説明する画像。
答えは0です。末尾の空要素が捨てられる点も結果に影響します。

元の投稿は、Xの出題ポスト回答ポストでも確認できます。

splitの引数は正規表現

String.splitは、引数を区切り文字そのものではなく正規表現として受け取ります。正規表現ではピリオドは「改行以外の任意の1文字」を表す記号です。そのため、見た目がピリオドでもJavaには単純な文字として伝わりません。

System.out.println("abc".matches("...")); // true
System.out.println("a.b".matches("...")); // true

3個のピリオドは任意の3文字に一致します。split(".")も同じ規則を使うので、文字列中の1文字ずつが区切りとして消費されます。ここを「splitの不具合」と考えるのではなく、「正規表現を渡すAPIである」と捉えることが重要です。

ピリオドそのもので分割する書き方

正規表現でピリオドを文字として扱うには、バックスラッシュでエスケープします。ただしJavaの文字列でもバックスラッシュが特別な文字なので、ソースコード上では2つ重ねて\\.と書きます。

String[] parts = "a.b".split("\\.");

System.out.println(parts.length); // 2
System.out.println(parts[0]);      // a
System.out.println(parts[1]);      // b

レビューではバックスラッシュの数だけを見るのではなく、最終的に正規表現エンジンへ\.が渡ることを説明できるか確認します。IDE上で見慣れないエスケープを見つけても、無闇に減らさないでください。

区切り文字が変数ならPattern.quoteを使う

設定ファイルや画面指定で区切り文字が変わる場合、どの記号が正規表現で特別かを呼び出し側へ意識させると漏れが出ます。Pattern.quoteを使うと、受け取った文字列全体を正規表現上の普通の文字として扱えます。

String delimiter = ".";
String[] parts = input.split(Pattern.quote(delimiter), -1);

縦棒の|、プラスの+、丸括弧などにも同じ方法を使えます。ただし、仕様として正規表現を入力させたい機能ではquoteしてはいけません。文字区切りなのか検索パターンなのか、APIの契約を先に決めます。

末尾の空項目を残すには第2引数が必要

標準のsplit(regex)は、結果の末尾に並ぶ空文字を捨てます。たとえば連携データがA.B.で、最後の列が未入力を表す場合、列数が3ではなく2になってしまいます。

System.out.println(Arrays.toString("A.B.".split("\\.")));
// [A, B]

System.out.println(Arrays.toString("A.B.".split("\\.", -1)));
// [A, B, ]

固定列のファイル連携では、空項目も列として残す必要があることが多いため-1を検討します。一方、末尾の空値を不要とする検索キーワードなどでは標準動作が都合よいこともあります。常に-1ではなく、列数の仕様から判断します。

業務データで起きる具体的な失敗

ファイル名やバージョン番号

report.2026.08.csvを分割して拡張子を取りたい処理で、ピリオドの扱いを誤ると要素が得られません。拡張子取得だけならPathやファイル名専用の処理も検討し、splitが本当に読みやすいかを確認します。

固定長ではない外部連携

連携先が末尾の空列を省略しない仕様なのに、受信側のsplitが空列を捨てると、項目位置が足りないという別の例外になります。入力値、期待列数、実際の列数をログへ残すと、調査時に原因を特定しやすくなります。

CSVをsplitで解析する

CSVには引用符、引用符内のカンマ、改行、エスケープがあります。単純なsplit(",")では正しく扱えません。案件で利用が許可されたCSVライブラリを使い、独自パーサーを増やさない方が安全です。

テストでは正常値だけでなく空項目を見る

区切り処理のテストは、通常の2項目だけでは不十分です。先頭が空、末尾が空、区切りが連続、区切りが存在しない、入力が空文字という境界値を並べます。

@ParameterizedTest
@CsvSource({
    "'A.B', 2",
    "'A.B.', 3",
    "'.A', 2",
    "'A..B', 3",
    "'A', 1"
})
void ピリオド区切りの列数を確認する(String input, int expected) {
    assertEquals(expected, input.split("\\.", -1).length);
}

テスト名には「splitをテストする」ではなく、何の業務データを何列として扱うかを書きます。実装方法を変更しても、業務上の契約が維持されているか確認できるテストになります。

現場レビューでよくある指摘

splitは短いコードなので、レビューで見落とされやすい処理です。区切り文字、正規表現、空項目、入力仕様を一緒に確認します。

// レビューコメント例
splitの引数は正規表現です。ピリオドそのものを区切るなら\\.へ変更してください。

// レビューコメント例
末尾の未入力項目も1列として扱う仕様なので、split(regex, -1)が必要です。
列数0件・末尾空・連続区切りのテストも追加してください。

// レビューコメント例
この入力はCSVなので、カンマsplitでは引用符内のカンマを扱えません。
案件標準のCSVパーサーを利用してください。

指摘を受けたらエスケープだけ直して終わらず、入力例を追加して期待列数を確認します。区切り処理は外部仕様と密接なので、コードだけでなくインターフェース定義書も確認してください。

提出前のセルフチェック

レビュー前に確認すること

  • 区切り文字は正規表現として正しいか
  • 文字として扱うならPattern.quoteを検討したか
  • 末尾の空要素を残す必要があるか
  • 先頭空・連続区切り・区切りなしを試したか
  • CSVをsplitだけで解析していないか
  • 期待列数が合わない場合のエラーを決めたか
  • 入力値をログへ出す場合に個人情報を含まないか

文字列APIを基礎から整理する参考書

Stringや正規表現の挙動を断片的な暗記で終わらせず、Javaの基本APIとして整理しておくと、ファイル連携や入力チェックのレビューで判断しやすくなります。

書籍「スッキリわかるJava入門 第5版」の表紙
商品画像:Amazon.co.jp
PR Java初学者向け

スッキリわかるJava入門 第5版

中山 清喬 (著), 国本 大悟 (著), 株式会社フレアリンク (監修)

Java文法とオブジェクト指向を、最初から整理する一冊。

豊富な図とサンプルで、変数、条件分岐、クラス、例外処理まで順番に学べます。Javaの最初の教科書を探している人向けです。

  • Javaを基礎から体系的に学びたい
  • Java 25 LTS対応の入門書を選びたい

当サイトはAmazonアソシエイト・プログラムの参加者です。価格・在庫・配送条件はAmazonでご確認ください。

この記事とあわせて読みたい

まとめ

String.splitは正規表現を受け取るため、ピリオドをそのまま渡すと任意の1文字として扱われます。ピリオドそのもので分割するならsplit("\\.")、変数ならPattern.quoteを使います。

外部連携では末尾の空項目も重要です。第2引数の-1、境界値テスト、期待列数の確認まで含め、入力仕様に合った分割処理にしてください。

-Java, クイズ
-, , , ,