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

Java 정규식(Regex)으로 유효한 이메일 주소 검증하기

입력받은 문자열이 유효한 이메일 주소인지 확인하려면, 해당 문자열이 아래의 정규식 패턴과 일치하는지 검사하면 됩니다.

"^[a-zA-Z0-9+_.-]+@[a-zA-Z0-9.-]+$"

이 정규식의 각 구성 요소는 다음과 같은 의미를 가집니다.

  • ^ : 문자열의 시작 위치를 나타냅니다.

  • [a-zA-Z0-9+_.-] : @ 기호 앞에서 영문 알파벳(대소문자 모두), 숫자, 그리고 "+", "_", ".", "-" 중 하나의 문자와 일치합니다.

  • + : 바로 앞의 문자 집합이 한 번 이상 반복됨을 의미합니다.

  • @ : @ 기호 자체와 일치합니다.

  • [a-zA-Z0-9.-] : @ 기호 뒤에서 영문 알파벳(대소문자 모두), 숫자, 그리고 ".", "-" 중 하나의 문자와 일치합니다.

  • $ : 문자열의 끝 위치를 나타냅니다.

즉, 이 패턴은 "로컬 파트@도메인 파트" 형태를 가지며, 로컬 파트에는 알파벳·숫자와 일부 특수문자(+, _, ., -)만 허용되고 도메인 파트에는 알파벳·숫자와 점(.), 하이픈(-)만 허용됩니다.

예제 1: String.matches() 메서드 활용

가장 간단한 방법은 String 클래스의 matches() 메서드를 사용하는 것입니다.

import java.util.Scanner;

public class ValidatingEmail {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("이메일 주소를 입력하세요: ");
        String email = sc.next();

        // 유효한 이메일 주소를 검사하는 정규식
        String regex = "^[a-zA-Z0-9+_.-]+@[a-zA-Z0-9.-]+$";

        // 입력된 이메일 주소를 정규식과 비교
        boolean result = email.matches(regex);

        if (result) {
            System.out.println("입력한 이메일 주소는 유효합니다.");
        } else {
            System.out.println("입력한 이메일 주소는 유효하지 않습니다.");
        }
    }
}

실행 결과 1

이메일 주소를 입력하세요:
example.samplemail@gmail.com
입력한 이메일 주소는 유효합니다.

실행 결과 2

이메일 주소를 입력하세요:
sample?examplemail@gmail.com
입력한 이메일 주소는 유효하지 않습니다.

두 번째 실행 결과에서처럼 허용되지 않는 특수문자(?)가 포함된 문자열은 패턴과 일치하지 않으므로 유효하지 않은 것으로 판별됩니다.

예제 2: Pattern 및 Matcher 클래스 활용

java.util.regex 패키지의 PatternMatcher 클래스를 사용하면 정규식을 객체로 컴파일하여 재사용할 수 있어, 여러 문자열을 반복적으로 검사할 때 더 효율적입니다.

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

public class Test {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        System.out.println("이름을 입력하세요: ");
        String name = sc.nextLine();

        System.out.println("이메일 주소를 입력하세요: ");
        String email = sc.next();

        // 유효한 이메일 주소를 검사하는 정규식
        String regex = "^[a-zA-Z0-9+_.-]+@[a-zA-Z0-9.-]+$";

        // Pattern 객체 생성
        Pattern pattern = Pattern.compile(regex);

        // Matcher 객체 생성
        Matcher matcher = pattern.matcher(email);

        // 입력된 이메일 주소의 유효성 검사
        if (matcher.matches()) {
            System.out.println("입력한 이메일 주소는 유효합니다.");
        } else {
            System.out.println("입력한 이메일 주소는 유효하지 않습니다.");
        }
    }
}

실행 결과 1

이름을 입력하세요:
vagdevi
이메일 주소를 입력하세요:
sample.123@gmail.com
입력한 이메일 주소는 유효합니다.

실행 결과 2

이름을 입력하세요:
raja
이메일 주소를 입력하세요:
raja$test@gmail.com
입력한 이메일 주소는 유효하지 않습니다.

위 예제에서 "$" 문자는 정규식에서 허용되지 않으므로 해당 이메일 주소는 유효하지 않다고 판별됩니다.

정리

간단한 단발성 검증에는 String.matches() 메서드가 편리하고, 동일한 패턴으로 여러 입력값을 검사해야 하는 경우에는 Pattern.compile()로 패턴을 미리 컴파일해 두고 Matcher로 검사하는 방식이 성능 면에서 유리합니다. 다만 실무에서는 RFC 표준에 따른 완전한 이메일 검증이 필요할 수 있으므로, 보다 엄격한 검증이 필요하다면 JavaMail의 InternetAddress 클래스 같은 전용 라이브러리를 활용하는 것도 고려해 볼 만합니다.