ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Regex] 정규식 / 정규표현식 (Regular Expression, Regex)
    개발기록 2022. 12. 23. 17:19
    반응형
    728x90

     

     

    개요

    정규식을 사용하기 위해서는 패턴, 기호, 플래그, 메서드를 알아야한다.

    정규식 docs 사이트 링크: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions

    정규식 테스트 사이트 링크: https://regexr.com/

    참고: https://curryyou.tistory.com/234, http://www.codejs.co.kr/정규식-regular-expression/, http://regexp.elex.pe.kr/regular-expression

     

    정규식 사용을 위해 알아야하는 부분

    1. 패턴

    패턴 의미
    a-zA-Z 영어알파벳(-으로 범위 지정), 보통 []와 같이 사용
    ㄱ-ㅎ가-힣 한글 문자(-으로 범위 지정), 보통 []와 같이 사용
    0-9 숫자(-으로 범위 지정), 보통 []와 같이 사용
    . 모든 문자열(숫자, 한글, 영어, 특수기호, 공백 모두! 단, 줄바꿈X)
    ex) s.d (sad처럼 s와 d사이에 해당되는 문자열 1개가 반드시 포함되어야함)
    \d 숫자
    \D 숫자가 아닌 것(특수문자 포함)
    \w 영어 알파벳, 숫자, 언더스코어(_)
    \W \w 가 아닌 것
    \s space 공백
    \S space 공백이 아닌 모든 것

     

    2. 기호

    기호 의미
    \ 특수문자를 표현하게 해줌
    ex) \! ('!'만 해당)
    \1 1~9까지의 숫자를 사용할 수 있으며, 괄호로 묶여진 그룹을 호출할 때 사용.
    ex) (a)(b)\1은 aba와 같음, (a)(b)\2는 abb와 같음
    | 또는(or)
    [] 괄호 안 문자들 중 하나
    ex) [a-z] (a부터 z까지 해당)
    [^문자] 괄호 안 문자를 제외한 것
    ex) [^test] ('t', 'e', 's', 't'를 제외한 모든 문자 해당)
    ^문자열 특정 문자열로 시작
    ex) ^t (test, tiger 등 't'로 시작하는 문자열만 해당)
    문자열$ 특정 문자열로 끝남
    ex) t$ (test, guest 등 't'로 끝나는 문자열만 해당)
    () 그룹화(그룹으로 묶어줌)
    ? 직전 문자 0 또는 1번 반복
    ex) ab?c (‘b’를 0번 또는 1번 포함하므로 ac, abc로 시작하는 문자열만 해당)
    ?= 전방탐색기호
    ex) aa(?=b)일 경우 aab에서 aa만 체크됨
    * 직전 문자 0번 이상 반복
    ex) ab*c (‘b’를 1번 이상 포함하므로 ac, abbc 등으로 시작하는 문자열 해당)
    + 직전 문자 1번 이상 반복
    ex) ab*c (‘b’를 1번 이상 포함하므로 abc, abbc 등으로 시작하는 문자열 해당)
    {n} 직전 문자 n번
    ex) ab{2}c (‘b’를 2번 포함하므로 abbc 시작하는 문자열만 해당)
    {n,} 직전 문자 최소 n번 이상 반복
    ex) ab{2,}c (‘b’를 2번 이상 포함하므로 abbc, abbbc 등으로 시작하는 문자열 해당)
    {n, m} 직전 문자 최소 n번 ~ 최대 m번 반복
    ex) ab{2,4}c (‘b’를 2번 이상 포함하므로 abbc, abbbc, abbbbc로 시작하는 문자열만 해당)

     

    3. 플래그

    - g와 i를 제외하곤 잘 안 쓸 것 같다,,

    플래그 의미
    g global, 전체범위(전역)
    i case insensitive, 대소문자 구분X
    m multiline
    s single line
    u unicode
    y sticky

     

    4. 메소드

    - js 기준

    메서드 의미
    "문자열".match(/정규표현식/플래그) "문자열"에서 "정규표현식"에 매칭되는 항목들을 배열로 반환
    "문자열".replace(/정규표현식/, "대체문자열") "정규표현식"에 매칭되는 항목을 "대체문자열"로 변환
    "문자열".split(정규표현식) "문자열"을 "정규표현식"에 매칭되는 항목으로 쪼개어 배열로 반환
    정규표현식.test("문자열") "문자열"이 "정규표현식"과 매칭되면 true, 아니면 false반환
    정규표현식.exec("문자열") match메서드와 유사(단, 무조건 첫번째 매칭 결과만 반환)

     

    자주 사용하는 예제

    1. const regex = /^[a-z\d]{4,12}$/

    - 영문(소문자), 숫자 4자리 이상 12자리 이하(영문 또는 숫자로만 가능)

     

    const regex = /^[a-z\d]{4,12}$/
    const ok = regex.exec("문자열")
    
    if(!ok) {
      return "영문(대문자), 한글, 특수문자를 제외한 4자리 이상 12자리 이하로 입력해주세요."
    }

     

    2. const regex = /(.)\1{3,}/

    - 동일 문자/숫자 4회 이상 반복

    - ex) (a)(b)\1{3,} 의 경우 aba{3,}과 같기때문에 결과가 abaaaa, abaaaaa로 시작하는 문자열이 해당된다.

     

    const regex = /(.)\1{3,}/
    const ok = regex.exec("문자열")
    
    if(ok) {
      return "동일 문자/숫자는 4회 이상 반복될 수 없습니다."
    }

     

    3. const regex = /^(?=.*[A-Za-z])(?=.*\d)(?=.*[@$!%*#?&])[A-Za-z\d@$!%*#?&]{8,15}$/

    - ()로 그룹화하고 ?=(전방탐색)을 통해서 무조건 1번 이상씩 들어가게끔 정규식을 만듦

    - 따라서 영문, 숫자, 특수문자들이 반드시 1개 이상 포함되어야함

    const regex = /^(?=.*[A-Za-z])(?=.*\d)(?=.*[@$!%*#?&])[A-Za-z\d@$!%*#?&]{8,15}$/
    const ok = regex.exec("문자열")
    
    if(!ok) {
      return "영문, 숫자, 특수문자를 포함한 8자리 이상 15자리 이하로 입력해주세요."
    }

     

    4. const regex = /012|123|234|345|456|567|678|789|890|098|987|876|765|654|543|432|321|210/g

    - 이 부분은 함수를 만들거나 이렇게 하드코딩해야할 것 같은데,, 함수를 만들기 귀찮아서 우선 하드코딩으로 처리했다.

    - 차후에 함수화로 변경 예정

    const regex = /012|123|234|345|456|567|678|789|890|098|987|876|765|654|543|432|321|210/g
    
    if("문자열".match(regex)) {
      return "연속된 숫자는 3자리 이상 쓸 수 없습니다."
    }

     

    728x90
Designed by Tistory.