본문 바로가기
카테고리 없음

정규표현식 정리하기

by 하나둘지금 2024. 7. 31.

개발하면서 간간히 보게되는 정규식에 대해서 정리해보고자 한다.

정규표현식

문자열의 일정한 패턴을 표현하는 일종의 형식 언어를 정규표현식이라고 한다. 보통 RegEx 혹은 RegExp라 많이 쓰고 정규식이라고 많이 한다.


정규 표현식에서 사용되는 기호를 메타문자라고 하는데, 표현식에서 내부적으로 특정 의미를 가진다.

종류 설명 예시 설명 예시
문자 클래스 특정 문자 집합을 정의하여 그 중 하나의 문자와 일치하도록 합니다. 대괄호([])로 감싸서 사용합니다. [abc] 'a', 'b', 'c' 중 하나의 문자와 일치
부정 문자 클래스 특정 문자를 제외한 문자 집합을 정의합니다. [^abc] 'a', 'b', 'c'를 제외한 모든 문자와 일치
수량자 패턴이 반복되는 횟수를 정의합니다. a* 'a'가 0회 이상 반복된 경우와 일치
    a+ 'a'가 1회 이상 반복된 경우와 일치
    a? 'a'가 0회 또는 1회 등장하는 경우와 일치
경계 메타문자 문자열의 시작(^)과 끝($)을 표현하여 특정 위치에서의 일치를 확인합니다. ^abc 문자열의 시작이 'abc'인 경우
    abc$ 문자열의 끝이 'abc'인 경우
그룹화 패턴을 그룹으로 묶어 복잡한 표현을 간단하게 만들 수 있습니다. 소괄호()로 묶습니다. (abc)+ 'abc'가 1회 이상 반복되는 경우와 일치
특수 문자 특정 기능을 하는 문자를 나타냅니다. \d 숫자와 일치 (0-9 중 하나)
    \w 알파벳 문자 및 숫자와 일치 (영문 대소문자, 숫자, 밑줄 포함)
    \s 공백 문자와 일치 (스페이스, 탭, 줄 바꿈 등)
전방 탐색 특정 패턴이 뒤따르는지 확인합니다. abc(?=def) 'abc' 뒤에 'def'가 있는 경우와 일치
후방 탐색 특정 패턴이 앞에 오는지 확인합니다. (?<=abc)def 'def' 앞에 'abc'가 있는 경우와 일치
임의의 문자 줄바꿈을 제외한 모든 문자와 일치합니다. . 어떤 문자와도 일치 (단, 줄바꿈 문자는 제외)
숫자 범위 특정 범위의 숫자와 일치합니다. [0-9] 0부터 9까지의 숫자 중 하나와 일치
문자 길이 제한 특정 길이의 문자열과 일치합니다. \w{3} 3자리의 알파벳 또는 숫자와 일치
옵션 특정 패턴이 있을 수도 있고 없을 수도 있음을 나타냅니다. abc? 'abc' 또는 'ab'와 일치 (여기서 'c'는 선택적)

 

정규식에 사용되는 플래그(Flag)는 정규표현식의 동작 방식을 변경하는 데 사용된다.

플래그 설명 사용 예시
g (global) 전체 문자열에서 모든 일치를 찾습니다. 기본적으로 첫 번째 일치만 찾습니다. /abc/g
i (ignore case) 대소문자를 무시하고 일치를 검사합니다. /abc/i
m (multiline) 여러 줄에서 시작(^)과 끝($) 메타문자의 동작을 변경합니다. 각 줄의 시작과 끝을 기준으로 합니다. /^abc/m
s (dotall) .가 줄바꿈 문자를 포함한 모든 문자와 일치하도록 합니다. /abc.s/
u (unicode) 유니코드 문자를 지원하여 UTF-16 코드 유닛을 기준으로 일치를 검사합니다. /\w/u
y (sticky) 현재 위치에서만 일치를 검사하며, 다음 위치로 이동하지 않습니다. /abc/y



정규표현식에 플래그가 없다면, 기본적인 동작 방식으로 작동하게 된다.

  • 플래그 i가 없으면, 대소문자를 구분하여 일치를 검사한다.
  • 플래그 g가 없으면, 정규표현식은 문자열에서 첫 번째 일치만 찾는다.
  • 플래그 m이 없으면, ^와 $는 문자열의 시작과 끝을 의미한다. 즉, 여러 줄의 경우 첫 번째 줄만 고려된다. 여러 줄에서의 일치를 원한다면 m 플래그를 사용해야 한다.
  • 플래그 s가 없으면, .는 줄바꿈 문자를 제외한 모든 문자와 일치힌다. 줄바꿈 문자를 포함한 모든 문자와 일치시키려면 s 플래그를 사용해야 한다.
  • 플래그 u가 없으면, 정규표현식은 기본적으로 ASCII 문자 집합만을 기준으로 하여 일치를 검사한다. 유니코드 문자를 포함한 문자열을 처리하려면 u 플래그가 필요하다.
  • 플래그 y가 없으면, 정규표현식은 문자열의 어느 위치에서든 일치를 찾을 수 있다. y 플래그가 있으면 현재 위치에서만 일치를 검사한다.

사용 예시

정규표현식은 이메일 검증, 전화번호 검증, URL 검증 등에 주로 사용된다.

1. 이메일 검증

자바 예시

import java.util.regex.*;

public class EmailValidator {
    public static void main(String[] args) {
        String email = "example@domain.com";
        String regex = "^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$";

        Pattern pattern = Pattern.compile(regex);
        Matcher matcher = pattern.matcher(email);

        if (matcher.matches()) {
            System.out.println("유효한 이메일 주소입니다.");
        } else {
            System.out.println("유효하지 않은 이메일 주소입니다.");
        }
    }
}

자바스크립트 예시

const email = "example@domain.com";
const regex = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/;

if (regex.test(email)) {
    console.log("유효한 이메일 주소입니다.");
} else {
    console.log("유효하지 않은 이메일 주소입니다.");
}


2. 전화번호 검증

자바 예시

import java.util.regex.*;

public class PhoneNumberValidator {
    public static void main(String[] args) {
        String phoneNumber = "010-1234-5678";
        String regex = "^\\d{3}-\\d{3,4}-\\d{4}$";

        Pattern pattern = Pattern.compile(regex);
        Matcher matcher = pattern.matcher(phoneNumber);

        if (matcher.matches()) {
            System.out.println("유효한 전화번호입니다.");
        } else {
            System.out.println("유효하지 않은 전화번호입니다.");
        }
    }
}

자바스크립트 예시

const phoneNumber = "010-1234-5678";
const regex = /^\d{3}-\d{3,4}-\d{4}$/;

if (regex.test(phoneNumber)) {
    console.log("유효한 전화번호입니다.");
} else {
    console.log("유효하지 않은 전화번호입니다.");
}


3. URL 검증

자바 예시

import java.util.regex.*;

public class URLValidator {
    public static void main(String[] args) {
        String url = "https://www.example.com";
        String regex = "^(https?://)?(www\\.)?[a-zA-Z0-9-]+\\.[a-zA-Z]{2,}(/.*)?$";

        Pattern pattern = Pattern.compile(regex);
        Matcher matcher = pattern.matcher(url);

        if (matcher.matches()) {
            System.out.println("유효한 URL입니다.");
        } else {
            System.out.println("유효하지 않은 URL입니다.");
        }
    }
}

자바스크립트 예시

const url = "https://www.example.com";
const regex = /^(https?:\/\/)?(www\.)?[a-zA-Z0-9-]+\.[a-zA-Z]{2,}(\/.*)?$/;

if (regex.test(url)) {
    console.log("유효한 URL입니다.");
} else {
    console.log("유효하지 않은 URL입니다.");
}


[참고]
https://ko.wikipedia.org/wiki/%EC%A0%95%EA%B7%9C_%ED%91%9C%ED%98%84%EC%8B%9D
https://hamait.tistory.com/342

 

정규표현식 (Regex) 정리

정규표현식은 아주 가끔 쓰기때문에 항상 다시 볼때마다 헷갈리곤 하기에 주요 사용예를 내가 나중에 다시 봤을 때 편하도록 정리하여 보았다. 정규 표현식의 용어들정규 표현식에서 사용되는

hamait.tistory.com

https://namu.wiki/w/%EC%A0%95%EA%B7%9C%20%ED%91%9C%ED%98%84%EC%8B%9D

 

정규 표현식

正 規 表 現 式 / Regular Expression 프로그래밍 에서 문자열을 다룰 때, 문자열의 일정한 패턴을

namu.wiki