언어(Language)/Java

[Java] 자바 정규 표현식(Regex) 개념 정리 및 활용

잇트루 2022. 10. 1. 00:01
반응형

Intro

대부분의 웹 서비스에서 회원 가입을 필요로 하며, 회원 가입 시 ID 또는 비밀번호를 설정할 때 특정 조건에 맞추어 입력하라고 요구한다.

예를 들어 비밀번호 입력 시 영문 대소문자를 한 번씩 이상 사용해야 하며, 12자 이상, 특수 문자 1개 이상 포함 등 서비스에서 요구하는 조건에 맞추어야 한다.

 

서비스 관리자는 이러한 요구사항의 유효성을 어떻게 설정하고 검증하는지는 여러 가지 방법이 있을 것이다. 문자를 하나하나 검사하거나, 모든 조건에 대해 참인 경우 등 다양한 방법이 있겠지만, 문자열 관리를 간편하게 하는 정규표현식도 있다.

 

정규 표현식(Regex : Regular Expression)이란?

정규표현식은 문자열에서 특정한 규칙에 따른 문자열 집합을 표현하기 위해 사용되는 형식 언어이다. 정규 표현식은 특정한 규칙을 갖는 문자열로 이루어진 표현식이며, 정규표현식에서의 문자는 각각의 고유한 규칙을 갖고 있다. 이러한 규칙을 조합하여 원하는 패턴을 만들고 특정 문자열에서 해당 패턴과 대응하는 문자를 찾는 등의 기능을 수행할 수 있다.

 

예를 들어, 비밀번호, 이메일, 전화번호 등 사용자가 제대로 입력했는지 검증해야 할 때 주로 정규 표현식을 사용하여 비교한다.

 

정규 표현식 기호

기본 기호

정규 표현식 설명
^ 문자열의 시작
$ 문자열의 끝
. 임의의 한 문자
? 앞의 문자가 없거나 한 개 있을 수 있음
* 앞의 문자가 없거나 한 개 이상 있을 수 있음
+ 앞의 문자가 최소 한 개 이상 있을 수 있음
\ 이스케이프 문자
| or(또는)을 의미. | 왼쪽 문자 또는 오른쪽 문자
() 그룹화 (하나의 문자로 취급할 때 사용)

 

문자열 관련 기호

표현식 설명
{n} 앞의 문자가 n개의 문자인 경우
{n,} 앞의 문자가 최소 n개의 이상인 경우
{n, m} 앞의 문자가 n개 이상 m개 이하인 경우
[] 하나의 문자
[abc] : a, b, c 중 하나를 포함한 경우
[^abc] : a, b, c를 제외한 문자를 포함한 경우
[0-9] : 0부터 9 숫자 중 하나를 포함한 경우
[a-z] : 소문자 a부터 z 중 하나를 포함한 경우
[A-Z] : 대문자 A부터 Z 중 하나를 포함한 경우
[a-zA-Z] : 모든 알파벳

 

그 외

표현식 설명
\d 모든 숫자, [0-9]와 동일한 기능
\n 줄 바꿈 문자 찾기
\s 공백 문자 찾기
\w 모든 알파벳과 언더 바(_), 모든 숫자, [a-zA-Z_0-9]와 동일한 기능
\D \d의 반대, [^0-9]와 동일한 기능
\S \s의 반대
\W \s의 반대, [^a-zA-Z_0-9]와 동일한 기능

 

정규 표현식 예제

휴대폰 번호 정규 표현식

010-1234-5678, 010-123-4567 등 핸드폰 번호를 검증하는 정규 표현식

010-\d{3,4}-\d{4}

\d{3, 4} : 3자리 또는 4자리 숫자

\d{4} : 4자리 숫자

 

이메일 정규 표현식

인터넷 이메일 주소를 검증하는 정규 표현식

\w+@\w+\.\w+(\.\w+)?

\w+ : 한 개 이상의 알파벳 또는 숫자

@ : @ 문자

\w+ : 한 개 이상의 알파벳 또는 숫자

\. : .

\w+ : 한 개 이상의 알파벳 또는 숫자

(\.\w+)? : \.\w+가 없거나 한 번 더 올 수도 있음

 

예를 들어 abc123@abc123.co.kr이라는 이메일 주소가 있다고 가정하면,

  1. @를 전까지의 한 개 이상의 알파벳 또는 숫자를 검사한다. (abc123)
  2. @문자를 검사한다. (@)
  3. 이후. 전까지의 한 개 이상의 알파벳 또는 숫자를 검사한다. (abc123)
  4. 점(.) 문자를 검사한다(.)
  5. 점(.) 검사 이후 한 개 이상의 알파벳 또는 숫자를 검사한다(co)
  6. 점(.) 문자가와 한 개 이상의 알파벳 또는 숫자가 한 번 더 올 수 있다.(.kr)

 

Pattern Class

정규 표현식으로 문자열을 검증하는 방법으로 Pattern 클래스의 matches() 메서드를 사용하여 정규식과 검증할 문자열을 검증할 수 있다.

검증할 문자열이 정규 표현식 양식에 맞기 작성되어 있다면 true, 그렇지 않으면 false를 반환한다.

 

핸드폰 번호 검증하기

import java.util.regex.Pattern;

public class RegexTest {
    public static void main(String[] args) {
        String phoneNumber1 = "010-1234-5678";
        String phoneNumber2 = "010-123-4567";
        // 이스케이프 문자를 활용해야 함
        String regExp = "010-\\d{3,4}-\\d{4}";

        // 정규 표현식 검증
        System.out.println(Pattern.matches(regExp, phoneNumber1));
        System.out.println(Pattern.matches(regExp, phoneNumber2));
    }
}
// 출력
true
true

 

이메일 검증하기

import java.util.regex.Pattern;

public class RegexTest {
    public static void main(String[] args) {
        String email1 = "abc123@abc123.co.kr";
        String email2 = "abc123@abc123com";
        // 이스케이프 문자를 활용해야 함
        String regExp = "\\w+@\\w+\\.\\w+(\\.\\w+)?";

        // 정규 표현식 검증
        System.out.println(Pattern.matches(regExp, email1));
        System.out.println(Pattern.matches(regExp, email2));
    }
}
// 출력
true
false
반응형