2 minute read

정규표현식이란?

정규표현식이란 사전적 의미로는 ‘특정한 규칙을 가진 문자열의 집합을 표현하는 데 사용하는 형식 언어이다.’라고 한다.

즉, 정규표현식은 문자열을 처리하는 데 사용되는 표현 방법 중 하나로, 특정한 규칙(패턴)을 정의해서 문자열에서 원하는 패턴을 찾아내거나 변경하는데 사용된다.

정규표현식으로 문자열의 패턴을 찾는다는 것은 다양한 경우에 사용된다

  1. 검색 엔진에서 검색어 처리
  2. 문자열 검색과 치화
  3. 유효성 검사
  4. DB에서 문자열 검색
  5. 로그 분석 및 처리
  6. 보안 검사 및 이메일 검증 등

위의 나열은 경우 말고도 많은 곳에 활용된다.

그럼 예시를 통해 정규표현식이 유용한 이유와 기본 문법에 대해 알아보자.


정규표현식 기본 문법

정규표현식의 문법은 언어마다 다를 수 있다. 여기서 다루는 정규표현식의 문법은 자바 기준!

표현식 설명
^ 문자열의 시작
. 임의의 한 문자(필수 입력, 문자의 종류 상관 x) (\는 넣을 수 없음)
* 앞 문자가 없을 수도 있고, 무한정 많을 수도 있음
+ 앞 문자가 하나 이상
? 앞 문자가 없어가 하나있음
[] 문자의 집합이나 범위를 나타내며 두 문자 사이는 - 기호로 범위를 나타냄 ([] 내에 ^가 선행하면 not을 나타냄
{} 횟수 또는 범위를 나타냄
() 소괄호 안의 문자를 하나의 문자로 인식
패턴 안에서 or 연산
\s 공백 문자
\S 공백 문자가 아닌 나머지 문자
\w 알파벳이나 숫자
\W 알파벳이나 숫자를 제외한 문자
\d 0~9 사이의 숫자
\D 숫자를 제외한 모든 문자
\ ’\’ 다음에 일반 문자가 오면 특수문자로 취급. ‘\’ 다음에 특수문자가 오면 그 문자 자체를 의미
(?i) 앞 부분에 (?i) 옵션을 추가하면 대소문자를 구분하지 않음

유효성 검증을 위한 정규표현식

위에서 살펴봤던 정규표현식의 활용 부분에서 패턴 매칭을 통한 유효성 검사를 자세히 알아보자.

우리가 웹 사이트나 모바일 애플리케이션에서 회원가입을 진행하다 보면 다음과 같은 문구를 쉽게 볼 수 있다.

스크린샷 2023-04-04 오전 10 53 46

위의 문장을 해석해보자

  1. 길이는 5 ~ 20
  2. 영문 소문자, 숫자, 특수기호(“_”, “-“)만 입력 가능
  3. 영문 소문자, 숫자, 특수기호만 입력 가능한 것이지, 모두 포함될 필요는 없다.

정규표현식을 사용하지 않고 요청받은 문자열이 위의 조건을 만족하는 지 검사하는 코드를 우선 알아보자.

public static boolean validateString(String str) {
    // 문자열이 null이거나, 길이가 5 미만 또는 20 초과이면 유효하지 않음
    if (str == null || str.length() < 5 || str.length() > 20) {
        return false;
    }
    
    // 문자열을 char 배열로 변환하여 하나씩 확인
    char[] chars = str.toCharArray();
    for (char c : chars) {
        // 문자가 영문 소문자, 숫자, 특수기호(_),(-) 중 하나가 아니면 유효하지 않음
        if (!(Character.isLowerCase(c) || Character.isDigit(c) || c == '_' || c == '-')) {
            return false;
        }
    }
    
    // 모든 문자가 영문 소문자, 숫자, 특수기호(_),(-)로만 이루어져 있으면 유효함
    return true;
}

위의 코드를 정규표현식을 이용해 다시 작성해보자.

public static boolean validateString(String str) {
    if (str == null) {
        return false;
    }
    String regex = "^[a-z0-9_-]{5,20}$";
    return str.matches(regex);
}

//  ^ : 문자열의 시작을 나타내는 메타 문자입니다.
//  [a-z0-9_-] : 소문자 알파벳(a부터 z)과 숫자(0부터 9) 그리고 특수문자 중 하나인 하이픈(-) 또는 밑줄(_) 중 하나를 나타내는 문자 클래스입니다.
//  {5,20} : 앞의 문자 클래스가 5~20번 반복되어야 함을 나타내는 중괄호 표기입니다.
//  $ : 문자열의 끝을 나타내는 메타 문자입니다.


위에서 작성한 정규표현식을 사용하지 않는 코드와 정규표현식을 사용한 코드를 보면 사용한 쪽이 훨씬 깔끔한 것을 볼 수 있다. 이렇게 정규표현식을 사용하면 다음과 같은 장점이 있다.

  1. 간결한 표현
    • 정규표현식을 사용하면 간결하고 강력한 표현으로 다양한 패턴을 작성할 수 있다. 많은 코드를 단순화하고 가독성을 높일 수 있다.
  2. 재사용성(물론 정규표현식을 사용하지 않아도 재사용할 수 있다.) (자바 기준)
    • 특정한 패턴을 여러 곳에서 재사용할 수 있다.
  3. 성능
    • 자바에서는 ‘java.util.regex’ 패키지를 통해 정규표현식을 지원한다. 이 패키지는 정규표현식을 컴파일하여 패턴 매칭에 필요한 구조를 만들고, 해당 구조로 매칭을 수행하여 성능을 보장한다.
    • 정규표현식을 컴파일하여 캐시에 저장한다. 이를 통해 동일한 패턴을 매번 컴파일하지 않고, 캐시에서 가져와서 사용할 수 있다. 이를 통해 성능을 높일 수 있다.

Categories:

Updated: