자바 정규 표현식

GoshK·2021년 9월 4일
0

정규 표현식이란?

정규 표현식은 특정한 규칙을 가진 문자열의 집합을 표현하기 위해 사용되는 형식 언어입니다. 전화번호, 아이디, 비밀번호 등 내가 원하는 형식대로 사용자가 제대로 입력했는지 검증을 해야 하는 경우 정규 표현식을 사용하면 이러한 검증로직을 쉽게 구현할 수 있습니다.
https://ko.wikipedia.org/wiki/%EC%A0%95%EA%B7%9C_%ED%91%9C%ED%98%84%EC%8B%9D

정규 표현식

^ 라인의 시작
$ 라인의 끝
? 앞 문자가 없거나 하나
*앞 문자가 없을 수도 무한정 많을 수도 있다.
[] 문자의 집합이나 범위를 나타내며 두 문자 사이는 - 기호로 범위를 나타냅니다. [] 내에서 ^ 가 선행하여 존재하면 not 을 나타낸다.
| 패턴 안에서 or 연산을 수행할 때 사용

이 밖에도 많은 표현 방법이 있습니다.
https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/regex/package-summary.html

자주 사용되는 정규 표현식

숫자 "^[0-9]*$"

영문자 "^[a-zA-Z]*$"

한글 "^[가-힣]*$"

E-Mail "\w+@\w+\.\w+(\.\w+)?"

전화번호 "^\d{2,3}-\d{3,4}-\d{4}$"

휴대전화번호 "^01(?:0|1|[6-9])-(?:\d{3}|\d{4})-\d{4}$"

주민등록번호 "\d{6} - [1-4]\d{6}"

우편번호 "^\d{3}-\d{2}$"

정규 표현식 사용 방법

자바에서 java.util.regex 패키지의 Pattern 과 Matcher 클래스를 사용하여 정규 표현식을 사용할 수 있습니다.

Pattern 클래스

정규 표현식의 컴파일된 표현입니다. Pattern 클래스의 matches 메소드를 호출하여 문자열을 검증할 수 있습니다. matches 는 만들어 놓은 정규 표현식과 검증하고자 하는 문자열을 각 파라미터로 받아서 일치할 경우 true 다를 경우 false 를 리턴해 줍니다.

public class Main {
    public static void main(String[] args) throws IOException {
        String pattern = "^[a-zA-Z]*$"; //영문만
        String val = "가나다라마바사";

        boolean isTrue = Pattern.matches(pattern, val);

        System.out.println(isTrue); //false
    }
} 

matches 이외에도 다양한 메서드들이 존재합니다.

compile(String regex) 주어진 정규 표현식을 패턴으로 컴파일합니다.
pattern() 컴파일된 정규 표현식을 String 형태로 반환합니다.
matcher(CharSequence input) 입력된 문자열에서 패턴을 찾는 Matcher 객체를 만듭니다.

Matcher 클래스

문자열이 패턴과 일치하는지 알아보는데 사용됩니다. Pattern 클래스의 matcher 메서드를 호출하여 Pattern 에서 매처를 만들어 냅니다.
매처를 사용하여 세 가지 다른 종류의 일치 작업을 수행할 수 있습니다.

  • 패턴에 대해 전체 입력 시퀀스를 일치시키려고 시도합니다.(matches)
  • 처음부터 패턴에 대해 입력 시퀀스를 일치시키려고 시도합니다.(lookingAt)
  • 패턴과 일치하는 다음 하위 시퀀스를 찾는 입력 시퀀스를 스캔합니다.(find)
public class Main {
    public static void main(String[] args) throws IOException {
        Pattern pattern = Pattern.compile("^[가-힣]*$"); //한글만
        String val = "가나다라마바사";

        Matcher matcher = pattern.matcher(val);

        System.out.println(matcher.find()); //true
    }
}

Matcher 클래스의 메서드

matches() 패턴에 대해 전체 영역을 일치시키려고 시도합니다.
replaceAll(String replacement) 패턴과 일치하는 입력 시퀀스의 모든 하위 시퀀스를 주어진 대체 문자열로 바꿉니다.

정규 표현식 사용하여 비밀번호 만들기

비밀번호는 반드시 대문자 + 소문자 + 숫자 + 특수문자(! @ # $) 를 최소 하나씩 포함하여 8 - 16자 사이여야 합니다.

public class Main {
    public static void main(String[] args) throws IOException {
        String[] arr = {"Aa123@", "Aabcd123**", "ABcdefg123##", "abc  ABC333$#", "ABCDEFG123!@"};

        Main.check(arr);
        
 //        Aa123@ 비밀번호 형식이 일치하지 않습니다.
//        Aabcd123** 비밀번호 형식이 일치하지 않습니다.
//        정상적인 비밀번호 입니다.
//        abc  ABC333$# 비밀번호 형식이 일치하지 않습니다.
//        ABCDEFG123!@ 비밀번호 형식이 일치하지 않습니다.

    }

    static void check(String[] arr) {
        //비밀번호는 반드시 대문자 + 소문자 + 숫자 + 특수문자(! @ # $) 를 최소 하나씩 포함하여 8 - 16자 사이여야 합니다.
        Pattern pattern = Pattern.compile("^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*[!@#$])(?=\\S+$)[a-zA-Z0-9!@#$].{8,16}$");

        for(int i = 0; i < arr.length; i++) {
            String val = arr[i];

            Matcher matcher = pattern.matcher(val);

            if(matcher.matches()) {
                System.out.println("정상적인 비밀번호 입니다.");
            } else {
                System.out.println(arr[i] + " 비밀번호 형식이 일치하지 않습니다.");
            }
        }

    }
}

스프링에서는 validation 을 사용하여 보다 간단하게 어노테이션으로 정규 표현식을 사용할 수 있습니다.

implementation 'org.springframework.boot:spring-boot-starter-validation' //gradle에 추가

@NotNull Null 불가
@NotBlank 빈 문자열, 스페이스만 있는 문자열 불가
@Pattern(regex= "") 정규 표현식을 만족하는지 체크
@Email 이메일 형식
@PositiveOrZero 양수와 0만 가능
@NegativeOrZero 음수와 0만 가능

이 밖에도 다양한 어노테이션이 존재합니다.

또한 어노테이션 조건에 만족하지 않을 시 보낼 메세지도 설정할 수 있습니다.

public class Hello {
    @NotNull(message = "null 값입니다.") //null X
    @NotEmpty
    @Size(min = 1, max = 10) //문자수 1 - 10
    @NotBlank //공백 X
    @Pattern(regexp = "^[a-zA-Z]*$") //정규 표현식
    private String name;
}

0개의 댓글