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

Javaの正規表現でMM/DD/YYYY形式の日付を検証する方法

Java の java.util.regex パッケージには、文字シーケンスの中から特定のパターンを見つけ出すためのさまざまなクラスが用意されています。

このパッケージの中心となる Pattern クラスは、正規表現をコンパイルした結果を表すクラスです。文字列と正規表現のマッチングを行う際には、主に次の2つのメソッドを使用します。

  • compile() — 正規表現を表す文字列を受け取り、コンパイル済みの Pattern オブジェクトを返します。

  • matcher() — 検証対象の文字列を受け取り、現在の Pattern オブジェクトが表すパターンと照合するための Matcher オブジェクトを生成します。

MM/DD/YYYY 形式に対応する正規表現

MM/DD/YYYY(例:01/12/2019)形式の日付に一致させるための正規表現は、次のとおりです。

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

この正規表現は、それぞれ次のような役割を持つ部分で構成されています。

  • (1[0-2]|0[1-9]) — 月の部分。「10〜12」または「01〜09」のみを許可し、13以上や一桁の月を除外します。

  • (3[01]|[12][0-9]|0[1-9]) — 日の部分。「31」「01〜29」「10〜19」をカバーし、01〜31 の範囲のみを許可します。

  • [0-9]{4} — 年の部分。任意の4桁の数字に一致します。

日付文字列を検証する手順

MM/DD/YYYY 形式の日付文字列を検証するには、以下の手順を実行します。

  1. Pattern クラスの compile() メソッドで上記の正規表現をコンパイルし、Pattern オブジェクトを取得します。

  2. 取得したオブジェクトに対して matcher() メソッドを呼び出し、検証したい日付文字列を引数として渡して Matcher オブジェクトを取得します。

  3. Matcher クラスの matches() メソッドを呼び出します。文字列がパターンに完全に一致すれば true、一致しなければ false が返されます。

サンプルコード

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 = Pattern.compile(regex);
        // 文字列に対してコンパイル済みパターンを照合
        Matcher matcher = pattern.matcher(date);
        boolean bool = matcher.matches();
        if(bool) {
            System.out.println("Date is valid");
        } else {
            System.out.println("Date is not valid");
        }
    }
}

実行結果

Date is valid

注意点と応用

この正規表現はあくまで形式の妥当性をチェックするものであり、「02/31」のように実在しない日付も有効と判断される点に注意が必要です。うるう年や各月の日数まで厳密に検証したい場合は、正規表現による事前チェックに加え、Java 8 以降で利用可能な java.time.LocalDate などの日付 API と組み合わせることをおすすめします。

また、ハイフン区切りの「MM-DD-YYYY」形式に対応させたい場合は、正規表現内の区切り文字「/」を「-」に置き換えるだけで対応できます。入力値のバリデーションにおいては、用途に応じて正規表現と日付ライブラリを使い分けることが重要です。

  1. 【Java】Jacksonの@JsonFormatアノテーションで複数の日付形式をマッピングする方法

    JacksonはJavaベースの人気ライブラリで、JavaオブジェクトをJSONへ変換したり、その逆にJSONからJavaオブジェクトへ変換したりする際に広く利用されています。複数の日付形式をマッピングしたい場合は、@JsonFormatアノテーションを使用します。これは、プロパティの値がどのようにシリアライズされるかを設定するための汎用アノテーションです。 @JsonFormatには、次の3つの重要なフィールドが用意されています。 shape: シリアライズ時に使用するデータの構造を定義します(JsonFormat.Shape.NUMBER または JsonFormat.Shape.STR

  2. Javaの正規表現を使って文字列からHTMLタグを抽出する方法

    Javaのjava.util.regexパッケージには、文字シーケンスの中から特定のパターンを検索するためのさまざまなクラスが用意されています。 このパッケージのPatternクラスは、正規表現をコンパイルした結果を表すクラスです。文字列と正規表現のマッチングを行うために、次の2つのメソッドが提供されています。 compile() − 正規表現を表す文字列を引数として受け取り、Patternクラスのオブジェクトを返します。 matcher() − 対象となる文字列を受け取り、その文字列を現在のPatternオブジェクトが表すパターンと照合するためのMatcherオブジェクトを生成します。