JavaのSpringで使う@Patternアノテーションを徹底解説!初心者でも理解できる正規表現バリデーション入門
生徒
「Springで入力チェックをしたいときに@Patternというアノテーションを見つけたんですが、これはどんなものなんですか?」
先生
「@Patternは、文字列が正規表現に一致するかどうかをチェックするバリデーションアノテーションです。例えばメールアドレスや電話番号の形式チェックに使えます。」
生徒
「なるほど!正規表現を使えば細かいルールを設定できるんですね。」
先生
「その通りです。具体的な使い方を見ていきましょう。」
1. @Patternアノテーションとは?
@Patternは、JavaのJakarta Validation仕様に用意されている文字列専用の入力チェック用アノテーションです。指定した正規表現(Regex)に文字列が一致しているかどうかを自動で判定してくれるため、Spring BootやSpring MVCのフォーム入力チェックでよく使われます。
初心者の方は、「文字の並び方にルールを決めるためのアノテーション」と考えると分かりやすいでしょう。たとえば「数字だけ許可する」「ハイフン付きの郵便番号だけOK」「決まった形式のメールアドレスか確認する」といったチェックを、if文を書かずに実現できます。
実際には、次のようにフィールドの上に@Patternを付けて、regexpでルールを書くだけです。
import jakarta.validation.constraints.Pattern;
public class SampleForm {
// 半角数字のみを許可する
@Pattern(regexp = "^[0-9]+$", message = "数字のみで入力してください")
private String number;
}
この例では、numberに数字以外の文字(アルファベットや記号など)が含まれているとバリデーションエラーになります。入力された値がルールに合っているかどうかを、Springが自動でチェックしてくれるのが特徴です。
@Patternは電話番号・郵便番号・会員ID・パスワードなど、「形式が決まっている文字列」のチェックと相性が良く、Webアプリケーションでは欠かせない基本的なバリデーションのひとつです。
2. 基本的な使い方
ここでは、@Patternの基本として「電話番号は数字だけで入力してほしい」という、よくある入力チェックを例に確認します。電話番号の欄にハイフンやスペース、全角数字が混ざると、システム側で扱いにくくなることがあるため、まずは半角数字のみに制限するのが定番です。
ポイントは、regexp(正規表現)で「許可する文字のルール」を書くことです。次の例では、^[0-9]+$で「先頭から最後まで数字だけ」という意味になります。
import jakarta.validation.constraints.Pattern;
public class UserForm {
// 電話番号は半角数字のみ(例:09012345678)
@Pattern(regexp = "^[0-9]+$", message = "電話番号は半角数字のみで入力してください")
private String phone;
// getter setter 略
}
もしphoneに「090-1234-5678」や「09012345678」のような値が入ると、ルールに合わないためバリデーションエラーになります。messageを日本語にしておくと、入力する人も「何を直せばいいか」がすぐ分かります。
なお、最初は難しく感じるかもしれませんが、@Patternは「文字列の形をそろえるための道具」です。電話番号のほかにも、郵便番号・会員ID・パスワードなど、形式が決まっている入力に同じ考え方で使えます。
将来を見据えて、+αのスキルを身につけたい方へ
JavaやLinuxを学んでいても、「このままで市場価値は上がるのか」 「キャリアの選択肢を広げたい」と感じる方は少なくありません。
AIを学ぶならアイデミープレミアム3. Spring MVCでの利用方法
フォームやAPIで受け取った値をSpring MVCでチェックしたいときは、コントローラ側で@Validated(または@Valid)を付けるのが基本です。これだけで、フォームクラスに書いた@Patternなどのバリデーションが自動で実行されます。
初心者の方は「コントローラに入ってきた時点で、まず入力の形式チェックをする」と覚えると分かりやすいです。電話番号やメールアドレスの形式が違うまま処理を進めると、後でエラーになったり、検索や登録がうまくいかなかったりするため、入口で止めるのが安全です。
import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
@Controller
@RequestMapping("/user")
public class UserController {
@PostMapping("/register")
@ResponseBody
public String register(@Validated @RequestBody UserForm form, BindingResult result) {
// 正規表現に一致しない場合はここでエラーになる
if (result.hasErrors()) {
return "入力内容に誤りがあります(電話番号の形式などを確認してください)";
}
return "登録された電話番号: " + form.getPhone();
}
}
この例では、UserFormのphoneに@Patternが付いている前提です。もし「090-1234-5678」のように正規表現に合わない値が送られてきた場合、result.hasErrors()がtrueになり、登録処理に進まずメッセージを返せます。
「どの画面(どのAPI)でも同じルールで入力チェックしたい」という場面でも、フォーム側に@Pattern、コントローラ側に@Validatedという組み合わせにしておくと、コードが散らばらず整理しやすくなります。
4. よく使う正規表現の例
@Patternは正規表現を自由に設定できるため、用途に応じたルールを実装できます。代表的な例をいくつか挙げます。
- 郵便番号(例: 123-4567):
^\d{3}-\d{4}$ - メールアドレス(簡易版):
^[A-Za-z0-9+_.-]+@[A-Za-z0-9.-]+$ - アルファベットのみ:
^[A-Za-z]+$
これらを@Patternのregexp属性に設定することで、入力値を効率的にチェックできます。
5. エラーメッセージのカスタマイズ
@Pattern違反時のエラーメッセージはmessage属性や外部プロパティファイルで変更可能です。messages.propertiesに定義すれば、複数箇所で使える共通のエラーメッセージを設定できます。
Pattern.userForm.phone=電話番号の形式が正しくありません
このようにすることで、プロジェクト全体で統一されたメッセージを表示できます。特に大規模システムではメッセージを一元管理することが重要です。
6. 他のバリデーションとの組み合わせ
@Patternは他のバリデーションアノテーションと組み合わせて使うと効果的です。例えば、必須入力かつ形式チェックを行いたい場合は@NotNullや@NotBlankと一緒に使います。
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Pattern;
public class Member {
@NotBlank
@Pattern(regexp="^[A-Za-z0-9]{6,12}$", message="ユーザーIDは半角英数字6〜12文字で入力してください")
private String userId;
}
この場合、空文字が送信されたり、規則に従わない文字列が送られたりすると、エラーメッセージが返されます。
7. 実際の活用シーン
@Patternは、ECサイトや会員登録フォーム、予約システムなど多くの場面で使われます。例えば、メールアドレスの形式をチェックして不正なアドレスを弾く、会員IDを英数字のみに制限する、パスワードに特定の条件を課すといった用途です。
Spring Bootと組み合わせることで、これらのチェックをサーバー側で自動的に行えるため、フロントエンドだけに依存しない堅牢なアプリケーションを作成できます。特にセキュリティやデータの整合性を重視するシステムでは欠かせない機能となります。