빈 필드를 포함한 이메일 유효성 검사 정규식
일반적으로 이메일 유효성 검사 시 입력값이 반드시 존재해야 하지만, 경우에 따라 빈 문자열(공백 입력)도 유효한 값으로 허용해야 할 때가 있습니다. 아래 정규식은 일반적인 이메일 형식과 빈 입력값을 모두 매칭합니다.
^([a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,6})?$정규식 구성 요소 설명
^: 문자열의 시작을 의미합니다.[a-zA-Z0-9._%+-]: @ 기호 앞에서 영문 알파벳(대소문자), 숫자, 그리고 "+", "_", ".", "%", "-" 중 한 글자와 매칭됩니다.+: 앞서 언급한 문자 집합이 1회 이상 반복될 수 있음을 나타냅니다.@: @ 기호 자체와 매칭됩니다.[a-zA-Z0-9.-]: @ 기호 뒤에서 영문 알파벳(대소문자), 숫자, ".", "-" 중 한 글자와 매칭됩니다.\.[a-zA-Z]{2,6}: 도메인의 마지막 마침표(.) 뒤에 오는 2~6글자의 최상위 도메인(com, net, kr 등)을 매칭합니다.$: 문자열의 끝을 의미합니다.(...)?: 괄호 안의 전체 패턴이 0회 또는 1회 출현할 수 있음을 의미하며, 이 덕분에 빈 입력값도 유효하게 처리됩니다.
예제 1: Pattern과 Matcher 클래스 활용
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class SampleTest {
public static void main( String args[] ) {
String regex = "^([a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,6})?$";
// 사용자로부터 입력 받기
Scanner sc = new Scanner(System.in);
System.out.println("Enter your name: ");
String name = sc.nextLine();
System.out.println("Enter your e-mail: ");
String e_mail = sc.nextLine();
System.out.println("Enter your age: ");
int age = sc.nextInt();
// Pattern 클래스 인스턴스 생성
Pattern pattern = Pattern.compile(regex);
// Matcher 클래스 인스턴스 생성
Matcher matcher = pattern.matcher(e_mail);
// 매칭 여부 확인
if(matcher.find()) {
System.out.println("e-mail value accepted");
} else {
System.out.println("e-mail not value accepted");
}
}
}실행 결과 1 (빈 이메일 입력)
Enter your name: krishna Enter your e-mail: Enter your age: 20 e-mail value accepted
위 실행 결과처럼 이메일을 입력하지 않고 넘어가도 정규식의 선택적 그룹(? ) 덕분에 유효한 것으로 판단됩니다.
실행 결과 2 (정상적인 이메일 입력)
Enter your name: Rajeev Enter your e-mail: rajeev.123@gmail.com Enter your age: 25 e-mail value accepted
예제 2: String.matches() 메서드 활용
Pattern과 Matcher 클래스를 직접 사용하지 않고, String 클래스가 제공하는 matches() 메서드를 이용하면 더 간결하게 코드를 작성할 수 있습니다.
import java.util.Scanner;
public class Example {
public static void main(String args[]) {
// 사용자로부터 문자열 입력 받기
System.out.println("Enter email address: ");
Scanner sc = new Scanner(System.in);
String e_mail = sc.nextLine();
// 정규식 정의
String regex = "^([a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,6})?$";
boolean result = e_mail.matches(regex);
if(result) {
System.out.println("Valid match");
} else {
System.out.println("Invalid match");
}
}
}실행 결과 1 (정상적인 이메일 입력)
Enter email address: rajeev.123@gmail.com Valid match
실행 결과 2 (빈 이메일 입력)
Enter email address: Valid match
마무리
핵심은 정규식 전체를 괄호로 묶고 ? 수량자를 붙여 이메일 패턴을 선택적(optional)으로 만든 것입니다. 이렇게 하면 올바른 이메일 형식과 빈 문자열 두 가지 경우만 통과되며, 그 외 잘못된 형식은 모두 거부됩니다. 실무에서는 폼의 필수 여부에 따라 이 정규식을 적절히 활용하면 유연한 유효성 검사 로직을 구현할 수 있습니다.