1. 標準的なメール形式は true
  2. 1 文字ずつの最小構成も true
  3. @ もドットも無い文字列は false
  4. ローカル部が空 (@ で始まる) は false
  5. 空文字列は false
  6. ドットが無い場合は false
  7. ドメイン部が空 (@. で続く) は false
コース一覧
Java 中級:コレクション・Stream・例外処理
正規表現の基本

Java 中級:コレクション・Stream・例外処理

コレクション、ジェネリクス、例外処理、Stream API、関数型インターフェース、日付処理、ファイル I/O、継承など Java の中級トピックを実践的に学べるコースです。Java の基礎文法とオブジェクト指向を理解している学習者を対象に、現場の Java コードを読み書きするための知識を補強します。約 16 時間 (1 日 30 分 × 32 日) で 64 レッスンを修了でき、修了後は Spring Boot や業務システム開発に必要な Java 力が身につきます。

1
コレクション基礎
01. ArrayList を使う5分
02. List を走査する5分
03. 要素の削除と検索5分
04. HashMap の基本5分
05. Map を走査する5分
06. Set で重複を排除5分
07. Collections クラスの便利メソッド5分
08. コレクション基礎 まとめクイズ5分
2
ジェネリクス
01. ジェネリッククラスを作る5分
02. ジェネリックメソッド5分
03. 境界型パラメータ5分
04. ワイルドカード ?5分
05. Pair<K,V> を作る5分
06. ジェネリクス まとめクイズ5分
3
例外処理
01. try-catch で例外をつかむ5分
02. 複数の catch ブロック5分
03. throws と例外の伝播5分
04. 独自の例外を作る5分
05. try-with-resources5分
06. finally ブロック5分
07. 例外処理 まとめクイズ5分
4
Stream API
01. Stream を作る5分
02. filter で絞り込む5分
03. map で変換する5分
04. reduce で集約する5分
05. collect で集める5分
06. sorted で並び替え5分
07. distinct で重複排除5分
08. limit と skip5分
09. 並列ストリーム5分
10. Stream API まとめクイズ5分
5
関数型インターフェース
01. ラムダ式の基本5分
02. メソッド参照 ::5分
03. Function インターフェース5分
04. Predicate インターフェース5分
05. Consumer と Supplier5分
06. BiFunction と 2 引数の関数5分
07. 関数型インターフェース まとめクイズ5分
6
文字列操作
01. String.format で書式化5分
02. StringBuilder で連結5分
03. 正規表現の基本5分
04. split と join5分
05. 文字列操作 まとめクイズ5分
7
日付と時刻
01. LocalDate で日付を扱う5分
02. LocalDateTime で時刻も扱う5分
03. Duration で時間差を計算5分
04. 日付の書式化とパース5分
05. 日付の加減算5分
06. 日付と時刻 まとめクイズ5分
8
ファイル I/O
01. Files でファイルに書き込む5分
02. ファイルを行単位で読む5分
03. Path でファイルパスを扱う5分
04. BufferedReader と Stream API5分
05. ファイルの存在確認と削除5分
06. ファイル I/O まとめクイズ5分
9
継承とポリモーフィズム
01. extends で継承する5分
02. super で親を呼ぶ5分
03. メソッドのオーバーライド5分
04. abstract で抽象クラス5分
05. interface で契約を定義5分
06. default メソッド5分
07. instanceof と型パターン5分
08. ポリモーフィズムを活かす5分
09. 継承とポリモーフィズム まとめクイズ5分

正規表現の基本

「決まった形かどうか」を for で調べると 20 行になる

商品コードが「英大文字が続いて、ハイフン、そのあと数字」という形になっているか確かめたいとします。charAt と for で真面目に書くと、位置を数えながら分岐を積む 20 行くらいのコードになります。しかも仕様が少し変わるたびに全部見直しです。

正規表現は、この「形」を 1 本の式で書くための小さな言語です。Java だけの道具ではないので、一度覚えれば他の言語でもほぼそのまま通用します。

かたまりは [ ] と + で表す

[ ] は「この中のどれか 1 文字」という意味です。[A-Z] のように - を挟むと範囲になり、[A-Za-z] のように範囲をいくつでも並べて書けます。+ は「直前のものが 1 文字以上続く」という意味です。

判定には String.matches を使います。

Java

public class Demo { public static void main(String[] args) { System.out.println("AB-1234".matches("[A-Z]+-[0-9]+")); // true System.out.println("Ab-1234".matches("[A-Z]+-[0-9]+")); // false System.out.println("AB-1234-9".matches("[A-Z]+-[0-9]+")); // false } }

2 行目が false なのは、[A-Z] に小文字が入っていないからです。3 行目が false なのは、matches が 文字列全体 の一致を見るからです。前半だけ合っていても通りません。一部に含まれているかを調べたいだけなら contains の方が手軽です。

式の中の - や @ のような文字は、そのまま書けばその文字自身を表します。区切りに使う記号は素直に書いて構いません。

. は「なんでも 1 文字」なので、そのままでは使えない

やっかいなのはドットです。正規表現の . は「任意の 1 文字」という意味なので、ドットそのものを表したいときは打ち消す必要があります。困るのは、打ち消し忘れても動いてしまうことです。

Java

System.out.println("1.20".matches("[0-9]+.[0-9]+")); // true System.out.println("1x20".matches("[0-9]+.[0-9]+")); // true System.out.println("1x20".matches("[0-9]+\\.[0-9]+")); // false

1 行目だけ見ると正しく動いているように見えますが、2 行目でドットのつもりが x まで通っています。3 行目のように \\. と書いて初めて「ドットという文字そのもの」になります。

\ が 2 つ並ぶのは Java 特有の事情です。Java の文字列リテラル自体が \ を特別扱いするので、二重に書く必要があります。

Java

String ok = "\\."; // 文字列としては \. の 2 文字、正規表現は「文字としてのドット」 String ng = "\."; // コンパイルエラー
解説

現場のメールアドレス検証は、規格どおりに書こうとすると手に負えない長さになります。形式はざっくり確かめて、本当に届くかどうかは確認メールを送って判断する、というのが実際のやり方です。

課題では、文字列全体が決まった形になっているかを matches で判定します。かたまりを [ ] と + で表し、区切りの記号はそのまま、ドットだけは打ち消す。この 3 点を組み合わせて式を作ってみてください。

要件

  1. String.matches を使って正規表現で完全一致を判定すること
  2. 正規表現は [A-Za-z0-9]+@[A-Za-z0-9]+\.[A-Za-z0-9]+ の形式で、@ の前後とドットの前後にそれぞれ 1 文字以上の英数字があることを保証すること
  3. ドット . は \\. のように Java 文字列内ではバックスラッシュ 2 つでエスケープすること

入出力例

isEmail("test@example.com") → true isEmail("a@b.c") → true isEmail("invalid") → false isEmail("@example.com") → false isEmail("") → false isEmail("test@examplecom") → false isEmail("test@.com") → false

ヒント

`String.matches` は完全一致で `boolean` を返すので、`^` や `$` のアンカーを自分で書かなくても文字列全体のマッチを判定できます

`[A-Za-z0-9]` は英大文字 + 英小文字 + 数字のいずれか 1 文字を表します。`+` を付ければ 1 文字以上の繰り返しになります

正規表現中のドット `.` は「任意の 1 文字」を意味するメタ文字なので、ドットそのものにマッチさせたいときは `\\.` と書きます (Java 文字列のエスケープでさらに `\\` に増える点に注意)

生田 陸人
監修生田 陸人
ゆめさくエンジニア / 現役ソフトウェアエンジニア監修者プロフィールを見る →
編集 ゆめさく編集部·公開 2026/05/19·更新 2026/08/26

関連レッスン

  • split と join

    Java の文字列を扱う上で必須の `String.split` と `String.join` を学び、CSV を逆順に並べ替えるメソッドを実装してみよう。

  • 文字列操作 まとめクイズ

    中級「文字列操作」章で学んだ `String.format` / `StringBuilder` / 正規表現 / `split` / `join` の使い分けを 4 択で総ざらいする章末まとめ。

  • LocalDate で日付を扱う

    Java 8 で導入された java.time.LocalDate を使って、日付の生成・加減算・整形を学び、年月日から ISO 形式の文字列を返すコードを書いてみよう。

  • Files でファイルに書き込む

    Java の標準ライブラリ `java.nio.file.Files` を使って、ファイルへの書き込みと読み込みをわずか数行で実現する方法を学ぼう。

main.java
学習モード
エディタを読み込んでいます

メモ

正規表現の基本

⌘S で保存