[정규 표현식] 정규 표현식(Pattern)

TW·2025년 4월 26일

정규 표현식

목록 보기
1/1

정규 표현식


정규 표현식이란 문자열의 일정한 패턴을 표현하는 일종의 형식 언어다.
주로 문자열 검색, 데이터 유효성 검사(이메일, 전화번호 등), 텍스트 치환 등에 사용된다.




정규 표현식 특징

  • 패턴 기반 검색
    정규표현식은 단순한 문자열 검색이 아닌, 형태(패턴)를 기준으로 검색한다.
    ex) 'apple'이라는 단어가 아니라 a[a-z]{4} 같은 규칙으로도 "apple"을 찾을 수 있다.

  • 언어 및 도구 독립적
    대부분의 프로그래밍 언어(예: Python, JavaScript, Java 등)텍스트 편집기(예: VS Code, Sublime Text)에서 사용 가능하다.




정규 표현식 장/단점

장점

  • 다양한 문자열 조작 가능
    문자열을 단순히 찾는 것 뿐만 아니라 검색, 치환, 추출, 분할 등 다양하게 사용한다.
  • 대부분의 언어 지원
    특징에서도 얘기한 것 처럼 다양한 프로그래밍 언어에서 사용이 가능하다.

단점

  • 가독성 부족
    아무래도 길고 복잡한 코드를 간결하게 쓰다보니 복잡한 표현이 많아 읽기 어렵다.
  • 성능 저하
    복잡한 정규식에서는 성능 이슈가 발생할 수 있다. 특히, .* 같은 그리디 패턴이 예상보다 많은 범위를 잡을 수 있어 주의 해야한다.



정규 표현식 기본 문법

그렇다면 어떻게 쓰는지 기본 문법에 대해 알아보자.

기호의미예시
.아무 문자 한 개a.b → "aab", "acb" 등
*앞 문자가 0번 이상 반복a*→ "", "a", "aaa" 등
+앞 문자가 1번 이상 반복a+ → "a", "aa" 등
?앞 문자가 0번 또는 1번a? → "", "a"
[]문자 집합[abc] → "a", "b", "c" 중 하나
[^]부정 문자 집합[^abc] → "a", "b", "c" 제외
\d숫자 (0~9)\d+ → 숫자 하나 이상
\w문자 (알파벳+숫자+_)\w+
^문자열의 시작^a → "a"로 시작
$문자열의 끝z$ → "z"로 끝남
{n}n번 반복a{3} → "aaa"
{n,m}n~m번 반복a{2,4} → "aa", "aaa", "aaaa"

그냥 문법만 보기에는 이해하기 힘든 부분이 많다. 그래서 예시를 들어서 설명해보려고 한다.



예시


네이버 회원가입으로 예시를 들어보려고 한다. 우리는 회원가입 할 때 아이디, 비밀번호, 이름, 생년월일 등 내 정보를 기입한다. 그 때, 네이버에서 맞춰놓은 형식에 맞지 않으면 가입할 수 없다.

나는 아이디를 111로 지정하고싶었지만, 밑에 5~20자의 영문 소문자, 숫자와 특수기호(_),(-)만 사용 가능하다고 나와있다.

그렇다면 이런 조건은 어떻게 걸어야 할까?
먼저 허용 문자를 지정한다.

  1. [a-z0-9_-]
  • a-z : 영문 소문자 a~z를 말한다.
  • 0-9 : 숫자를 사용.
  • -,_ : 특수문자 _와-만 사용.

그 다음에는 길이를 지정한다.

  1. [a-z0-9_-]{5,20}
  • {5,20} : 5~20까지로 길이를 지정.

마지막으로는 이렇게만 작성하면 '일치하는 부분'만 확인하기 때문에 우리는 문자열 전체를 확인하기 위해 시작과 끝인 ^,$을 넣어줘야 한다.

  1. ^[a-z0-9_-]{5,20}$

마지막은 자바로 예시를 들어보겠다.

import java.util.regex.*;

public class IDValidator {
    public static void main(String[] args) {
        String userId = "gpt_user-1";  // 테스트할 아이디
        String pattern = "^[a-z0-9_-]{5,20}$";

        boolean isValid = Pattern.matches(pattern, userId);

        if (isValid) {
            System.out.println("유효한 아이디입니다.");
        } else {
            System.out.println("유효하지 않은 아이디입니다.");
        }
    }
}

기본 문법 이외 것들도 많고 Matcher class, ReplaceAll class도 있다. 그것들은 다음에 다뤄보도록 하겠다.

0개의 댓글