Computer >> 컴퓨터 >  >> 프로그래밍 >> Java

날짜와 시간 형식을 검증하는 Java 정규식 작성 방법

정규식 매칭의 기본 절차

주어진 문자열과 정규 표현식(Regex)을 매칭하여 데이터를 검증하려면 다음 세 단계를 거쳐야 합니다.

  • 정규식 컴파일 : Pattern 클래스의 compile() 메서드를 사용해 정규 표현식을 컴파일합니다.
  • Matcher 객체 생성 : Pattern 클래스의 matcher() 메서드에 검증 대상 문자열을 인자로 전달하여 Matcher 객체를 얻습니다.
  • 매칭 결과 확인 : Matcher 클래스의 matches() 메서드는 문자열이 정규식과 완전히 일치하면 true, 그렇지 않으면 false를 반환합니다. 이 메서드를 호출하여 데이터의 유효성을 검사할 수 있습니다.

예제 1 : 날짜 형식만 매칭하기

다음은 yyyy-MM-dd 형식의 날짜만 정확히 매칭하는 Java 정규식 예제입니다.

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

public class Sample {
    public static void main(String args[]){
        // 날짜를 저장할 리스트 생성
        List<String> dates = new ArrayList<>();
        dates.add("25-12-1990");
        dates.add("25/12/1990");
        dates.add("2010-06-24");
        dates.add("05-02-1990");
        dates.add("1920-11-03");

        // 날짜 형식을 검증하는 정규 표현식
        String regex = "[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])";

        // 정규 표현식 컴파일
        Pattern pattern = Pattern.compile(regex);

        // 각 날짜를 순회하며 매칭
        for(String date : dates) {
            Matcher matcher = pattern.matcher(date);
            System.out.println(date + ": " + matcher.matches());
        }
    }
}

실행 결과 :

25-12-1990: false
25/12/1990: false
2010-06-24: true
05-02-1990: false
1920-11-03: true

위 정규식에서 각 패턴의 의미는 다음과 같습니다.

  • [0-9]{4} : 4자리 연도 (0000~9999)
  • (0[1-9]|1[0-2]) : 01월부터 12월까지만 허용
  • (0[1-9]|[1-2][0-9]|3[0-1]) : 01일부터 31일까지만 허용

따라서 구분자가 /인 "25/12/1990"이나 월·일 범위를 벗어나는 값은 모두 false로 판별됩니다.

예제 2 : 날짜와 시간 함께 매칭하기

다음 예제는 날짜에 더해 HH:mm:ss 형식의 시간까지 함께 검증합니다.

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

public class Sample {
    public static void main(String args[]){
        // 날짜와 시간을 저장할 리스트 생성
        List<String> dates = new ArrayList<>();
        dates.add("25-12-1990");
        dates.add("25/12/1990");
        dates.add("2010-06-24 12:30:40");
        dates.add("05-02-1990 44:205:40");
        dates.add("1920-11-03 06:25:40");

        // 날짜 및 시간 형식을 검증하는 정규 표현식
        String regex = "[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1]) (2[0-3]|[01][0-9]):[0-5][0-9]:[0-5][0-9]";

        // 정규 표현식 컴파일
        Pattern pattern = Pattern.compile(regex);

        // 각 항목을 순회하며 매칭
        for(String date : dates) {
            Matcher matcher = pattern.matcher(date);
            System.out.println(date + ": " + matcher.matches());
        }
    }
}

실행 결과 :

25-12-1990: false
25/12/1990: false
2010-06-24 12:30:40: true
05-02-1990 44:205:40: false
1920-11-03 06:25:40: true

시간 부분인 (2[0-3]|[01][0-9]):[0-5][0-9]:[0-5][0-9]는 00시~23시, 00분~59분, 00초~59초 범위만 허용합니다. 따라서 시간 값이 비정상적인 "44:205:40"은 false로 판별됩니다.

정리

matches() 메서드는 문자열 전체가 정규식과 일치해야 true를 반환한다는 점에 유의하세요. 부분 일치를 확인하려면 find() 메서드를 사용하는 것이 적합합니다. 또한 실무에서는 단순 형식 검증을 넘어 실제 존재하는 날짜(예 : 2월 30일)까지 확인해야 할 경우 java.time.LocalDate 같은 API와 함께 사용하는 것이 좋습니다.