정규식이란 무엇일까?

박승우·2024년 5월 31일

자 서른 여덟 번째 키워드인 정규식을 알아 볼 것이다.

정규화는 들어 봤어도 정규식은 처음들어보는 개념이라 부족할 수 있으니 양해 부탁드립니다.

정규식(Regex)이 뭔데요?

정규식(정규 표현식, Regular Expression, regex)은 문자열에서 특정 패턴을 찾고, 일치하는 부분을 추출하거나, 치환하거나, 검증하는 데 사용하는 문자열 패턴을 나타내는 방법이라고 한다.
정규식은 문자열의 검색 및 조작을 자동화하는 도구로, 주로 프로그래밍 및 텍스트 처리에서 많이 사용된다.

정규식(Regex)의 구성요소

정규식은 여러 가지 특수 문자와 메타 문자를 사용하여 특정 패턴을 표현한다.
이를 통해 문자열 검색, 치환, 검증 등을 수행할 수 있다.

1. 문자 클래스

문자 클래스는 대괄호 [] 안에 포함된 문자 중 하나와 일치한다.

'[abc]' - 'a', 'b', 또는 'c' 중 하나
'[a-z]' - 소문자 알파벳 중 하나 (a부터 z까지)
'[A-Z]' - 대문자 알파벳 중 하나 (A부터 Z까지)
'[0-9]' - 숫자 중 하나 (0부터 9까지)
'[^abc]' - 'a', 'b', 'c'가 아닌 문자
'[\d\w]' - 숫자(\d) 또는 단어 문자(\w) 중 하나

2. 수량자

수량자는 특정 패턴이 몇 번 반복될지를 나타낸다.

'a*' - 'a'가 0번 이상 반복
'a+' - 'a'가 1번 이상 반복
'a?' - 'a'가 0번 또는 1번
'a{n}' - 'a'가 정확히 n번 반복
'a{n,}' - 'a'가 n번 이상 반복
'a{n,m}' - 'a'가 n번 이상 m번 이하 반복

3. 경계

경계는 특정 위치를 나타낸다.

'^' - 문자열의 시작
'$' - 문자열의 끝
'\b' - 단어의 경계 (단어의 시작이나 끝)
'\B' - 단어가 아닌 경계 (단어의 시작이나 끝이 아닌 위치)

4. 특수 문자

특수 문자는 특정한 의미를 가지며, 특정 종류의 문자와 일치한다.

'.' - 임의의 한 문자 (줄 바꿈 문자를 제외)
'\d' - 숫자 문자 [0-9]와 동일
'\D' - 숫자가 아닌 문자
'\w' - 단어 문자 (알파벳, 숫자, 밑줄)
'\W' - 단어 문자가 아닌 문자
'\s' - 공백 문자 (스페이스, 탭, 줄 바꿈 등)
'\S' - 공백 문자가 아닌 문자

5. 그룹과 캡처

괄호 ()를 사용하여 부분 패턴을 그룹화하고 캡처할 수 있다.

'(abc)' - 'abc'와 일치하며, 캡처 그룹 1
'(?:abc)' - 'abc'와 일치하지만 캡처하지 않음 (비캡처 그룹)
'(?P< name >abc)' - 'abc'와 일치하며, 캡처 그룹에 이름 'name' 지정

6. 선택

선택은 파이프 |를 사용하여 여러 패턴 중 하나와 일치한다.

'a|b' - 'a' 또는 'b'
'(abc|def)' - 'abc' 또는 'def'

7. 이스케이프 문자

특수 문자를 일반 문자로 사용하려면 백슬래시 \를 사용하여 이스케이프한다.

'.' - 실제 점 문자 '.'
'\' - 실제 백슬래시 문자 ''

정규식의 예제

  1. 이메일 주소 검증
^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$

'^[a-zA-Z0-9._%+-]+' - 알파벳, 숫자, '.', '_', '%', '+', '-' 문자가 1개 이상 반복되고, 문자열의 시작과 일치함
'@[a-zA-Z0-9.-]+' - '@' 뒤에 알파벳, 숫자, '.', '-' 문자가 1개 이상 반복됨
'.[a-zA-Z]{2,}$' - '.' 뒤에 알파벳 문자가 2개 이상이며, 문자열의 끝과 일치함

  1. 전화번호 검증
^01[016789]-\d{3,4}-\d{4}$

'^01[016789]' - '01' 뒤에 '0', '1', '6', '7', '8', '9' 중 하나가 옴
'-\d{3,4}' - '-' 뒤에 숫자가 3개에서 4개 옴
'-\d{4}$' - '-' 뒤에 숫자가 4개 있으며, 문자열의 끝과 일치함

  1. 예시코드 (C# - Unity)
using System.Text.RegularExpressions;
using UnityEngine;

public class RegexExampleUnity : MonoBehaviour
{
    void Start()
    {
        string pattern = @"^01[016789]-\d{3,4}-\d{4}$";
        string[] phoneNumbers = { "010-1234-5678", "011-123-4567", "123-4567-8901" };

        foreach (var number in phoneNumbers)
        {
            if (Regex.IsMatch(number, pattern))
            {
                print($"{number} 이 번호는 형식에 맞음.");
            }
            else
            {
                print($"{number} 이 번호는 형식에 맞지 않음");
            }
        }
    }
}

위 코드처럼 RegularExpressions의 네임스페이스를 사용하여 Regex.IsMatch() 함수를 통해
검사하였다.
정규식은 다양한 상황에서 매우 강력한 도구이다. 이를 통해 문자열을 보다 효율적으로 처리하고 원하는 패턴을 쉽게 찾을 수 있다고 한다.

결론 - 느낀 점

와 진짜 이번꺼는 이론보다는 그냥 수학 공식을 다시 보는 느낌이었다.

각종 이상한 문자를 보면서 '이렇게 조합하면 검사를 할 수 있구나...' 를 깨달았다.

이런걸 진작에 알았다면 다양한 분야에 사용했을것 같다.

profile
게임을 좋아하는 사람 입니다!

0개의 댓글