본문 바로가기

'.' Programs/JavaScript

[Javascript] 정규식


입력 유효성 검사 및 파일 구문 분석과 관련하여 정규식을 사용하여 수행할 수 있는 작업은 다양합니다. 가장 일반적인 식 중 일부는 사용할 수 있는 기능 및 옵션으로 인해 기억하기 어려운 경우가 많습니다. 다음은 일반적으로 사용되는 정규식 목록입니다.

사회 보장 번호 \d{3}-\d{2}-\d{4}
미국 전화 번호 ((\(\d{3}\) ?)|(\d{3}-))?\d{3}-\d{4}
미국 우편 번호 \d{5}(-\d{4})?
인터넷 전자 메일 주소 [\w-]+@([\w-]+\.)+[\w-]+
인터넷 URL http://([\w-]\.)+[\w-](/[\w- ./?%=]*)?
단순 암호(숫자) ^(?=.*\d).{4,8}$
고급 암호(대문자, 소문자, 숫자) ^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{4,8}$
공용 파일 마스크 ^(.+)\\(.+)\.(.+)
주요 신용 카드 \d{4}-?\d{4}-?\d{4}-?\d{4}

정규식의 개념

  • 정규식은 복잡한 패턴매칭과 대치 규칙을 정의하는 문자열이다.
  • 정규식은 파일이나 문자열 내에 포함되어 있는 특별한 패턴(또는 특별한 조건을 만족하는 문자열)을 검색하기 위해 미리 정의된 다양한 특수 문자들의 조합이다.
  • 정규식은 니모닉(mnemonic)값으로 간략하게 표현되는 기호로 만들어진다. 예를 들면, 단일 문자열 .은 "임의의 단일 문자열과 매치된다."는 의미이고, 문자 +는 "하나또는 그이상의 앞선식"이라는 의미이다.

    정규식을 정확히 정의하려면, automata, regular language, finite state machine 등을 설명해야 합니다. 그냥 일반적으로는 패턴매칭을 위한 언어라고 넘어갈 수 있지만, 정규식으로 matching할 수 없는 패턴도 많고, 왜 정규식에 이런 연산자가 없을까 고민하기 시작하면, 모든 것이 모호해져버립니다.

    ^ (caret) 라인의 처음이나 문자열의 처음을 표시 ^aaa (문자열의 처음에 aaa를 포함하면 참, 그렇지 않으면 거짓)
    $ (dollar) 라인의 끝이나 문자열의 끝을 표시 aaa$ (문자열의 끝에 aaa를 포함하면 참, 그렇지 않으면 거짓)
    . (period) 임의의 한 문자를 표시 ^a.c (문자열의 처음에 abc, adc, aZc 등은 참, aa 는 거짓)
    a..b$ (문자열의 끝에 aaab, abbb, azzb 등을 포함하면 참)
    [] (bracket) 문자의 집합이나 범위를 나타냄, 두 문자 사이의 "-"는 범위를 나타냄 [] 내에서 "^"이 선행되면 not을 나타냄
    {} (brace) {} 내의 숫자는 직전의 선행문자가 나타나는 횟수 또는 범위를 나타냄 a{3} ('a'의 3번 반복인 aaa만 해당됨)
    * (asterisk) "*" 직전의 선행문자가 0번 또는 여러번 나타나는 문자열 ab*c ('b'를 0번 또는 여러번 포함하므로 ac, ackdddd, abc, abbc, abbbbbbbc 등)
    + "+" 직전의 선행문자가 1번 이상 나타나는 문자열 ab+c ('b'를 1번 또는 여러번 포함하므로 abc, abckdddd, abbc, abbbbbbbc 등, ac는 안됨)
    ? "?" 직전의 선행문자가 0번 또는 1번 나타나는 문자열 ab?c ('b'를 0번 또는 1번 포함하므로 abc, abcd 만 해당됨)
    () (parenthesis) ()는 정규식내에서 패턴을 그룹화 할 때 사용
    | (bar) or를 나타냄 a|b|c (a, b, c 중 하나, 즉 [a-c] 와 동일함)
    \ (backslash) 위에서 사용된 특수 문자들을 정규식내에서 문자로 취급하고 싶을 때 '\'를 선행시켜서 사용하면됨 filename\.ext ("filename.ext"를 나타냄)

    정규식에서는 위에서 언급한 특수 문자를 제외한 나머지 문자들은 일반 문자로 취급함

    위의 정규식 연산자 가운데 vi에서는 지원하지 않는 연산자가 있습니다. vi의 경우 +연산자도 없습니다. regular expression library에 따라 지원하는 연산자의 종류가 상당히 다릅니다. 요즘은 perl-style regular expression이 표준으로 자리잡아가는 것이 대체적인 추세이고, perl의 regular expression은 가장 복합하고 기능이 많은 편입니다.


    [abc] (a, b, c 중 어떤 문자, "[a-c]."과 동일)
    [Yy] (Y 또는 y)
    [A-Za-z0-9] (모든 알파벳과 숫자)
    [-A-Z]. ("-"(hyphen)과 모든 대문자)
    [^a-z] (소문자 이외의 문자)
    [^0-9] (숫자 이외의 문자)
    [[:digit:]] ([0-9]와 동일)
    a{3,} ('a'가 3번 이상 반복인 aaa, aaaa, aaaa, ... 등을 나타냄)
    a{3,5} (aaa, aaaa, aaaaa 만 해당됨)
    ab{2,3} (abb와 abbb 만 해당됨)
    [0-9]{2} (두 자리 숫자)
    doc[7-9]{2} (doc77, doc87, doc97 등이 해당)
    [^Zz]{5} (Z와 z를 포함하지 않는 5개의 문자열, abcde, ttttt 등이 해당)
    .{3,4}er ('er'앞에 세 개 또는 네 개의 문자를 포함하는 문자열이므로 Peter, mother 등이 해당)
    * (선행문자가 없는 경우이므로 임의의 문자열 및 공백 문자열도 해당됨)
    .* (선행문자가 "."이므로 하나 이상의 문자를 포함하는 문자열, 공백 문자열은 안됨)
    ab* ('b'를 0번 또는 여러번 포함하므로 a, accc, abb, abbbbbbb 등)
    a* ('a'를 0번 또는 여러번 포함하므로 k, kdd, sdfrrt, a, aaaa, abb, 공백문자열 등)
    doc[7-9]* (doc7, doc777, doc778989, doc 등이 해당)
    [A-Z].* (대문자로만 이루어진 문자열)
    like.* (직전의 선행문자가 '.'이므로 like에 0 또는 하나 이상의 문자가 추가된 문자열이 됨, like, likely, liker, likelihood 등)
    ab+ ('b'를 1번 또는 여러번 포함하므로 ab, abccc, abb, abbbbbbb 등)
    like.+ (직전의 선행문자가 '.'이므로 like에 하나 이상의 문자가 추가된 문자열이 됨, likely, liker, likelihood 등, 그러나 like는 해당안됨)
    [A-Z]+ (대문자로만 이루어진 문자열)
    yes|Yes (yes나 Yes 중 하나, [yY]es와 동일함)
    korea|japan|chinese (korea, japan, chinese 중 하나)
    [\?\[\\\]] ('?', '[', '\', ']' 중 하나)

    한글이름 정규식 : [\uac00-\ud7a3]{2,4}