Java
 Computer >> コンピューター >  >> プログラミング >> Java

【Java】正規表現で日付文字列(MM-dd-yyyy形式)を検証する方法

Javaでは、正規表現(Regex)を使うことで、文字列として与えられた日付が「MM-dd-yyyy」形式に合致しているかどうかを簡単に検証できます。この記事では、実際に使える正規表現パターンと、その具体的な実装方法を2つのサンプルコードで解説します。

MM-dd-yyyy形式に対応する正規表現

以下の正規表現は、「月/日/年」(例: 09/26/1989)という形式の日付にマッチします。

^(1[0-2]|0[1-9])/(3[01]|[12][0-9]|0[1-9])/[0-9]{4}$

各部分の意味は次の通りです。

  • 月の部分1[0-2] または 0[1-9] → 01〜12 のみ許可
  • 日の部分3[01][12][0-9]0[1-9] → 01〜31 のみ許可
  • 年の部分[0-9]{4} → 任意の4桁の数字

PatternクラスとMatcherクラスを使った検証方法

文字列の中から指定形式の日付を検証するには、以下の手順を実行します。

  1. Pattern クラスの compile() メソッドで、上記の正規表現をコンパイルします。
  2. matcher() メソッドの引数に検証対象の文字列を渡し、Matcher オブジェクトを取得します。
  3. Matcher クラスの matches() メソッドは、マッチすれば true、しなければ false を返すので、これを呼び出してデータを検証します。

サンプルコード1

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class MatchingDate {
    public static void main(String[] args) {
        String date = "01/12/2019";
        String regex = "^(1[0-2]|0[1-9])/(3[01]|[12][0-9]|0[1-9])/[0-9]{4}$";
        // パターンオブジェクトを作成
        Pattern pattern = Pattern.compile(regex);
        // 文字列に対してコンパイル済みパターンを適用
        Matcher matcher = pattern.matcher(date);
        boolean bool = matcher.matches();
        if (bool) {
            System.out.println("日付は有効です");
        } else {
            System.out.println("日付は無効です");
        }
    }
}

実行結果

日付は有効です

String.matches()メソッドを使った簡易的な検証方法

String クラスの matches() メソッドは、引数として受け取った正規表現と現在の文字列を照合し、マッチすれば true、そうでなければ false を返します。このメソッドを使えば、よりシンプルに形式チェックが可能です。

手順は以下の2ステップだけです。

  1. 検証したい日付文字列を取得します。
  2. その文字列に対して matches() メソッドを呼び出し、引数に上記の正規表現を渡します。

サンプルコード2

import java.util.Scanner;

public class Just {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("名前を入力してください:");
        String name = sc.nextLine();
        System.out.println("生年月日を入力してください:");
        String dob = sc.nextLine();
        // MM-DD-YYYY形式の日付を受け入れる正規表現
        String regex = "^(1[0-2]|0[1-9])/(3[01]|[12][0-9]|0[1-9])/[0-9]{4}$";
        boolean result = dob.matches(regex);
        if (result) {
            System.out.println("入力された生年月日は有効です");
        } else {
            System.out.println("入力された生年月日は無効です");
        }
    }
}

実行結果1(無効な形式の場合)

名前を入力してください:
Janaki
生年月日を入力してください:
26/09/1989
入力された生年月日は無効です

日が先に来る「26/09/1989」という入力は、月の位置にある値が13以上になるため、パターンにマッチせず無効と判定されます。

実行結果2(有効な形式の場合)

名前を入力してください:
Janaki
生年月日を入力してください:
09/26/1989
入力された生年月日は有効です

注意点:カレンダー上の妥当性までは検証できない

この正規表現はあくまで「形式」のチェックのみを行います。そのため、「02/31/2020」のような実在しない日付でも、形式としては正しいため通過してしまいます。存在しない日付まで厳密に排除したい場合は、Java 8以降で利用できる java.time.format.DateTimeFormatter クラスと LocalDate.parse() を組み合わせる方法を併用することをおすすめします。

  1. 【Java入門】文字列をDate型に変換する方法をわかりやすく解説

    はじめにJavaでは、SimpleDateFormatクラスを使うことで、文字列形式の日付データをDateオブジェクトへ簡単に変換できます。本記事では、具体的なサンプルコードとともに、その基本の手順をわかりやすく解説します。変換元の文字列を用意するまず、以下のように日付を表す文字列を用意します。String date1 = 11/10/2018; String date2 = 15-Mar-2019 21:11:35;文字列から日付への変換手順SimpleDateFormatのコンストラクタには、元の文字列の書式に対応したパターンを指定します。その後、parse()メソッドを呼び出すことで、文

  2. JavaのGsonライブラリで日付をフォーマットする方法|setDateFormat()の使い方

    Gsonは、Googleが開発したJava向けのJSONライブラリです。Gsonを利用すると、JavaオブジェクトからJSON文字列を生成したり、その逆にJSONをJavaオブジェクトへ変換したりすることができます。 Gsonインスタンスを作成するには、まずGsonBuilderのインスタンスを生成し、create()メソッドを呼び出します。そして、Dateオブジェクトを任意の日付形式でシリアライズしたい場合は、setDateFormat()メソッドを使用します。このメソッドに日付パターンを渡すことで、Gsonは指定されたパターンに従ってDateオブジェクトをJSON文字列へ変換します。 構文