정규식 매칭의 기본 절차
주어진 문자열과 정규 표현식(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와 함께 사용하는 것이 좋습니다.