[TIL] Day27_정규표현식

오진선·2024년 3월 2일
0

TIL

목록 보기
18/29
post-thumbnail

Today I Learned

정규표현식(Regular Expression)

프로그래밍에서 문자열을 다룰 때, 문자열의 일정한 패턴을 표현하는 일종의 형식 언어

기본 문법

  • 패턴 그대로를 매칭 : 편집기에서 '찾기' 기능을 통해 특정 단어를 찾는 것처럼, 단어 그대로를 패턴으로 사용하여 매칭되는 영역 찾음
  • 메타문자 및 수량 한정자를 사용 : 정규식 패턴에 쓰이는 문자 중에는 특별한 의미를 지니는 메타 문자들이 있는데, 이러한 메타문자와 그 메타문자의 개수를 지정(수량 한정자의 역할)하여 폭넓은 패턴을 매칭
  • 그룹 및 Look around(전,후방 탐색) 기능을 사용 : 패턴의 일부를 그룹으로 묶거나, 특정 패턴의 앞 또는 뒤로 다른 패턴이 오는 조건을 더하는 경우(Look around 활용)

Meta 문자

  • ^ : 문자열의 시작을 표현.
    ex) ^http : 문자열이 'http'로 시작하는 경우에만 매칭.
    대괄호 안에서 쓰이는 경우 -> ^ 뒤에 오는 문자열 패턴과 일치하지 않는 것을 매칭.
    ex) ab[^0-9] : 'ab' 뒤에 숫자가 아닌 것이 오는 것만 매칭.
    (abc -> 매칭O / ab1 -> 매칭X)

  • $ : 문자열의 끝을 표현.
    ex) tem$ : 문자열이 'tem'으로 끝난 경우에만 매칭
    ('item' -> 매칭O / 'contemporary' -> 매칭X)

  • \b : 문자와 공백 사이를 표현.
    문자열의 시작, 끝, 개행, 탭, 콤마(','), 구두점('.'), 대시('-') 등
    ex) \bplay\b : 단어 경계로 구분되는 'play'에는 매칭.
    ('I play the game on the playground' 에서 'play'를 매칭
    'playground' 는 매칭X)

  • \B : \b 가 아닌것.
    ex) play\B : 'play' 뒤에 단어의 경계가 아닌 것이 올때, 즉 문자열의 연속이 되는 패턴만 매칭.
    ('I play the game on the playground' 에서 'playground' 를 매칭O, 'play'는 매칭X
    이때 'playground'를 매칭한다고 해서 'playground' 전체를 의미하는 것이 아닌, 'playground' 안의 'play' 만을 찾아낸다.)

  • \s : 모든 White-space (공백) 문자에 매칭. [\t\n\r\f\v] 와 동일한 의미.

  • \S : White-space (공백) 문자를 제외한 모든 문자에 매칭.

  • \d : 모든 숫자를 매칭. [0-9] 와 동일한 의미.

  • \D : 숫자가 아닌 모든 문자를 매칭. [^0-9] 와 동일한 의미.

  • \w : 단어를 만들 수 있는 문자를 매칭. 알파벳 대소문자, 숫자, 언더스코어를 포함. [A-Za-z0-9_] 와 동일한 의미.

  • \W : \w에 포함되지 않는 모든 문자를 매칭.

  • \n : LF(Line Feed)를 의미. 즉, 엔터(개행문자)를 의미.

    \r 은 CR(Carriage Return)을 의미하는데, UNIX 에서 엔터의 의미를 LF 하나만 쓰는 것으로 보고, Windows에서는 CRLF를 함께 쓰는 것이 엔터를 의미한다. 현대에 와서는 에디터가 알아서 둘다 같이 엔터로 해석시켜 주므로, 엔터를 표현하려고 한다면 그냥 \n 만 사용해도 무방하다.

  • \ : 이스케이프용 문자. 정규식 상의 특별한 의미를 가지는 문자들을 해당 문자 그대로 사용하고자 할 때 사용하는 문자이다.
    ex) \^ : '^' 문자 그대로를 의미.

  • . : 모든 문자 1개를 매칭. 이때 공백 한칸도 문자 1개로 취급됨.

선택 패턴

  • | (Vertical Bar, Pipe) : OR의 의미.
    ex) tomato | potato : 'tomato'라는 패턴 또는 'potato'라는 패턴과 일치하는 모든 것들을 매칭
  • [ ... ] : 대괄호 안의 문자 하나하나들 모두가 OR의 요소로 보면 됨.
    ex) [cfh]all : 'call', 'fall', 'hall' 에 모두 매칭. [0-9], [a-z] 와 같이 - 를 활용하여 숫자 전체 또는 알파벳(소문자) 전체 등의 특정 범위를 지정

수량 한정자

동일한 글자 혹은 그룹이 n개 만큼 나오는 경우 사용

  • "?" : 바로 앞의 글자 혹은 그룹이 1개 혹은 0개 임을 의미.
    ex) apples? : ? 바로 앞의 글자인 's'가 있을 수도 있고, 없을 수도 있으므로, 'apple', 'apples' 에 매칭.

  • "" : 0개 이상을 의미.
    ex) n\d
    : 'n' 뒤에 숫자가 0개 이상이라는 의미. 'n', 'n1', 'n123' 등에 모두 매칭.

  • "+" : 1개 이상을 의미.
    ex) n\d+ : 'n' 뒤에 숫자가 1개 이상이라는 의미. 'n1', 'n123' 등에 모두 매칭되나, 'n' 에는 매칭되지 않음.

  • "{n}" : n 개가 있다는 것을 의미.
    ex) n\d{2} : 'n' 뒤 숫자가 2개 오는 패턴을 의미. 'n12' 에는 매칭되나, 'n', 'n1', 'n123' 에는 매칭되지 않음.
    'n123' 이라는 문자열에서는 'n12' 까지만 매칭하고, 3은 제외시키게 됨.

  • "{n, m}" : n개 이상, m개 이하를 의미. 이때 m을 생략하여 {n, } 와 같이 쓸 수 있는데, 이는 n개 이상 만을 의미.
    ex 1) n\d{2, 3} : 'n12', 'n123' 에는 매칭되지만, 'n1'이나 'n1234'에는 매칭되지 않음.

사용 예제

  • 개별 숫자 : /[0-9]/g
    전체에서  0~9사이에 아무 숫자 '하나'  찾음 

  • 개발 문자 - /[to]/g
    전체에서 t  혹은 o  를 모두 찾음 

  • 단어 : /filter/g
    전체에서  f 따로 i 따로 찾는게 아니라 'filter' 라는 단어에 매칭되는것을 찾음 

  • 단어 제외 : /\b(?:(?!to)\w)+\b/g
    전체에서 'to' 라는 단어를 빼고 다른 단어 매칭 /  확인결과 "Tutorial" 도 제외됨. 

  • 단어 제외 : \b(?!\bto\b)\w+\b
    전체에서 'to' 라는 단어를 빼고 다른 단어 매칭 /  확인결과 "Tutorial" 는 제외 안됨.  이게 더 정확하다고 볼수있을듯. 

  • 이메일 : /^0-9a-zA-Z@0-9a-zA-Z.[a-zA-Z]{2,3}$/i
    '시작을'  0~9 사이 숫자 or a-z A-Z 알바펫 아무거나로 시작하고  /  중간에 -  . 같은 문자가 있을수도 있고 없을수도 있으며 / 
    그 후에 0~9 사이 숫자 or a-z A-Z 알바펫중 하나의 문자가 없거나 연달아 나올수 있으며 /  @ 가 반드시 존재하고  / 
    0-9a-zA-Z 여기서 하나가 있고  /  중간에 -
     . 같은 문자가 있을수도 있고 없을수도 있으며 / 그 후에 0~9 사이 숫자 or a-z A-Z 알바펫중 하나의 
    문자가 없거나 연달아 나올수 있으며 /  반드시  .  이 존재하고  / [a-zA-Z] 의 문자가 2개나 3개가 존재 /   이 모든것은 대소문자 구분안함 

  • 전화번호 : /^\d{3}-\d{3,4}-\d{4}$/
    시작을 숫자 3개로하며 /   중간에 하이픈 -  하나 존재 /  숫자가 3~4개 존재하며 /  하이픈 하나 존재 /  숫자 4개로 끝남 
  • 핸드폰 번호 : /^01([0|1|6|7|8|9]?)-?([0-9]{3,4})-?([0-9]{4})$/
    시작을 숫자 01로 시작하며 그 후에 0,1,6,7,8,9 중에 하나가 나올수도 있으며 /  하이픈 - 하나 존재할수도 있으며 /  숫자 3~4개 이어지고 / 
    또 하이픈 - 하나 존재할수도 있으며 /  숫자 4개가 이어짐 
  • URL : ^(https?):\/\/([^:\/\s]+)(:([^\/]))?((\/[^\s/\/]+))?\/?([^#\s\?])(\?([^#\s]))?(#(\w))?$
    ^(https?):\/\/
    ([^:\/\s]+)
    (:([^\/]
    ))?
    ((\/[^\s/\/]+))?\/?([^#\s\?])(\?([^#\s]))?(#(\w))?$

출처: https://hamait.tistory.com/342 [HAMA 블로그:티스토리]

profile
₍ ᐢ. ̫ .ᐢ ₎

0개의 댓글