Paradox Simulation

728x90
반응형

 

 

지난번에는 Java에서 정규식을 사용하는 기본적인 방법을 알아보았습니다.
이번에는 좀 더 복잡한 정규식 패턴과 그것을 활용하는 방법에 대해 알아보겠습니다.

 

복잡한 패턴 작성하기

복잡한 패턴을 작성할 때는, 여러 패턴을 조합하거나, 반복되는 부분을 간결하게 나타내는 등의 방법을 사용할 수 있습니다.
다음은 이메일 주소를 검증하는 더 복잡한 예시 코드입니다.

 

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

public class EmailValidator2 {
    private static final String EMAIL_REGEX =
        "^(([\\w-]+\\.)+[\\w-]+|([a-zA-Z]{1}|[\\w-]{2,}))@"
        +"((([0-1]?[0-9]{1,2}|2[0-4][0-9]|25[0-5])\\.([0-1]?[0-9]{1,2}|2[0-4][0-9]|25[0-5])\\."
          +"([0-1]?[0-9]{1,2}|2[0-4][0-9]|25[0-5])\\.([0-1]?[0-9]{1,2}|2[0-4][0-9]|25[0-5])){1}|"
        +"([a-zA-Z]+[\\w-]+\\.)+[a-zA-Z]{2,4})$";

    public static void main(String[] args) {
        Pattern pattern = Pattern.compile(EMAIL_REGEX);

        String email1 = "abc@gmail.com";
        String email2 = "abc.def_ghi-jklm.nop-qrs-tuv_wxyz@example.com";
        String email3 = "abc.def@sub.example.co.kr";
        String email4 = "abc.def@example..com";

        System.out.println("Email1: " + validateEmail(email1, pattern));
        System.out.println("Email2: " + validateEmail(email2, pattern));
        System.out.println("Email3: " + validateEmail(email3, pattern));
        System.out.println("Email4: " + validateEmail(email4, pattern));
    }

    public static String validateEmail(String email, Pattern pattern) {
        Matcher matcher = pattern.matcher(email);

        if (matcher.matches()) {
            return "올바른 이메일 주소입니다.";
        } else {
            return "잘못된 이메일 주소입니다.";
        }
    }
}

 

위 코드에서 정규식 패턴으로 사용된 EMAIL_REGEX는 이메일 주소의 올바른 형식을 정의하는 패턴입니다.
이메일 주소의 올바른 형식은 굉장히 복잡하기 때문에, 이것을 하나의 정규식 패턴으로 표현하는 것은 쉽지 않습니다.
따라서, 위 예시 코드에서는 이메일 주소의 각 부분에 대한 패턴을 따로 만들어 조합한 것을 볼 수 있습니다.

이메일 주소의 올바른 형식은 다음과 같이 구성됩니다.

 

이메일 주소 = 로컬 파트@도메인 파트

 

여기서 로컬 파트는 다음과 같은 규칙을 따릅니다.

 

  • 로컬 파트는 알파벳, 숫자, 특수문자(. - _ % +)로 구성됩니다.
  • 특수문자(. - _ % +)는 처음과 끝에 올 수 없습니다.
  • 로컬 파트에서 마침표(.)가 연속해서 나오지 않습니다.

 

도메인 파트는 다음과 같은 규칙을 따릅니다.

 

  • 도메인 파트는 최소한 한 개의 마침표(.)를 포함합니다.
  • 마침표(.)는 도메인 이름의 일부분을 구분하는 데 사용됩니다.
  • 도메인 이름은 알파벳, 숫자, 하이픈(-)으로 구성됩니다.
  • 도메인 이름은 하이픈(-)으로 시작하거나 끝나지 않습니다.
  • 도메인 이름의 길이는 2~4글자 사이입니다.

위 규칙을 바탕으로, 이메일 주소의 올바른 형식을 정의하는 패턴을 다음과 같이 작성할 수 있습니다.

 

^(([\\w-]+\\.)+[\\w-]+|([a-zA-Z]{1}|[\\w-]{2,}))@
((([0-1]?[0-9]{1,2}|2[0-4][0-9]|25[0-5])\\.([0-1]?[0-9]{1,2}|2[0-4][0-9]|25[0-5])\\.
([0-1]?[0-9]{1,2}|2[0-4][0-9]|25[0-5])\\.([0-1]?[0-9]{1,2}|2[0-4][0-9]|25[0-5])){1}|
([a-zA-Z]+[\\w-]+\\.)+[a-zA-Z]{2,4})$

위 패턴은 다음과 같은 구조로 이루어져 있습니다.

 

^(([\\w-]+\\.)+[\\w-]+|([a-zA-Z]{1}|[\\w-]{2,}))@
((([0-1]?[0-9]{1,2}|2[0-4][0-9]|25[0-5])\\.([0-1]?[0-9]{1,2}|2[0-4][0-9]|25[0-5])\\.
([0-1]?[0-9]{1,2}|2[0-4][0-9]|25[0-5])\\.([0-1]?[0-9]{1,2}|2[0-4][0-9]|25[0-5])){1}|
([a-zA-Z]+[\\w-]+\\.)+[a-zA-Z]{2,4})$

 

  • ^: 문자열의 시작을 의미합니다.
  • (([\\w-]+\\.)+[\\w-]+|([a-zA-Z]{1}|[\\w-]{2,})): 로컬 파트를 나타내는 패턴입니다.
  • ([\\w-]+\\.)+[\\w-]+: 알파벳, 숫자, 특수문자로 구성된 문자열(로컬 파트의 일부) 다음에 마침표(.)가 한 개 이상 온 경우를 의미합니다. 예를 들어, abc.def.ghi.jkl과 같은 문자열을 나타냅니다.
  • ([a-zA-Z]{1}|[\\w-]{2,}): 알파벳 한 글자 또는 알파벳, 숫자, 특수문자로 구성된 두 글자 이상의 문자열(로컬 파트의 일부)을 의미합니다. 예를 들어, a 또는 abc와 같은 문자열을 나타냅니다.
  • @: 로컬 파트와 도메인 파트를 구분하는 기호입니다.
  • ((([0-1]?[0-9]{1,2}|2[0-4][0-9]|25[0-5])\\.([0-1]?[0-9]{1,2}|2[0-4][0-9]|25[0-5])\\. ([0-1]?[0-9]{1,2}|2[0-4][0-9]|25[0-5])\\.([0-1]?[0-9]{1,2}|2[0-4][0-9]|25[0-5])){1}|: IP 주소 형식의 도메인 파트를 나타내는 패턴입니다.
    이 패턴은 다음과 같은 구조로 이루어져 있습니다.
  • ([0-1]?[0-9]{1,2}|2[0-4][0-9]|25[0-5]): 0부터 255까지의 숫자를 나타내는 패턴입니다.
  • \\.: 마침표(.)를 의미합니다.
  • (([0-1]?[0-9]{1,2}|2[0-4][0-9]|25[0-5])\\.([0-1]?[0-9]{1,2}|2[0-4][0-9]|25[0-5])\\.([0-1]?[0-9]{1,2}|2[0-4][0-9]|25[0-5])\\.([0-1]?[0-9]{1,2}|2[0-4][0-9]|25[0-5])){1}|: IP 주소 형식의 도메인 파트를 나타내는 패턴입니다.
  • ([a-zA-Z]+[\\w-]+\\.)+[a-zA-Z]{2,4}): 도메인 이름 형식을 나타내는 패턴입니다.
  • ([a-zA-Z]+[\\w-]+\\.)+: 알파벳으로 시작하는 문자열(도메인 이름의 일부) 다음에 하이픈(-) 또는 알파벳, 숫자로 구성된 문자열(도메인 이름의 일부)이 하나 이상 연속해서 나오는 경우를 의미합니다. 마지막 하이픈(-)이나 마침표(.)는 올 수 없습니다. 예를 들어, abc-def.ghi-jkl.mno와 같은 문자열을 나타냅니다.
  • [a-zA-Z]{2,4}: 알파벳으로 구성된 두 글자 이상, 네 글자 이하의 문자열(도메인 이름의 일부)을 의미합니다. 예를 들어, com, kr, net과 같은 문자열을 나타냅니다.
  • $: 문자열의 끝을 의미합니다.

위 패턴을 사용하여 이메일 주소를 검증하는 방법은 다음과 같습니다.

 

public static boolean isValidEmail(String email) {
    String regex = "^(([\\w-]+\\.)+[\\w-]+|([a-zA-Z]{1}|[\\w-]{2,}))@"
            + "((([0-1]?[0-9]{1,2}|2[0-4][0-9]|25[0-5])\\.([0-1]?[0-9]{1,2}|2[0-4][0-9]|25[0-5])\\."
            + "([0-1]?[0-9]{1,2}|2[0-4][0-9]|25[0-5])\\.([0-1]?[0-9]{1,2}|2[0-4][0-9]|25[0-5])){1}|"
            + "([a-zA-Z]+[\\w-]+\\.)+[a-zA-Z]{2,4})$";
    Pattern pattern = Pattern.compile(regex);
    Matcher matcher = pattern.matcher(email);
    return matcher.matches();
}

 

위 코드는 String 타입의 email 변수에 저장된 이메일 주소가 유효한 형식인지 검증합니다.
검증 결과는 boolean 타입으로 반환됩니다.

위에서 작성한 패턴을 사용하여 이메일 주소를 검증할 수 있습니다.
Pattern 클래스를 사용하여 패턴을 컴파일하고, Matcher 클래스를 사용하여 이메일 주소와 패턴을 비교합니다.
matches() 메서드는 이메일 주소가 패턴과 일치하면 true를 반환합니다.

이메일 주소 검증 기능을 추가하면 사용자가 입력한 이메일 주소가 유효한 형식인지 검증할 수 있습니다.
이를 통해, 유효하지 않은 이메일 주소가 입력되는 것을 방지합니다.

 

정리하기

이번 글에서는 Java에서 정규식을 사용하는 방법과 간단한 예시를 살펴보았습니다.
먼저, 정규식이란 문자열에서 패턴을 찾거나 검증하는데 사용되는 표현식이라고 설명했습니다.
그리고, Java에서는 java.util.regex 패키지를 통해 정규식을 사용할 수 있으며, Pattern과 Matcher 클래스를 이용하여 정규식을 컴파일하고, 문자열과 비교할 수 있다는 것을 알아보았습니다.

또한, 이메일 주소와 전화번호 검증을 예시로 살펴보았습니다.
이메일 주소와 전화번호를 검증하는 정규식 패턴을 만들어서 사용자가 입력한 문자열이 해당 패턴과 일치하는지 확인할 수 있다는 것을 확인했습니다.

정규식은 문자열 처리를 할 때 매우 유용한 도구입니다.
하지만, 정규식을 사용하기 전에는 정규식 문법과 패턴을 충분히 숙지하고, 검증과 디버깅을 철저히 해야합니다.
이를 통해, 원하는 결과를 얻을 수 있고, 유효하지 않은 입력값으로 인한 오류를 방지할 수 있습니다.

다음 글에서는 Java에서 정규식을 사용하는 방법에 대해 더 자세히 알아보도록 하겠습니다.

728x90
반응형
250x250
반응형

공유하기

facebook twitter kakaoTalk kakaostory naver band