신입 개발자에서 시니어 개발자가 되기까지

31장 정규표현식 본문

책읽기/Javascript Deep Dive

31장 정규표현식

Jin.K 2022. 9. 14. 11:29

개념

a. 일정한 패턴을 가진 문자열의 집합을 표현하기 위해 사용하는 형식 언어.
b. 반복문과 조건문 없이 원하는 패턴을 검사할 수 있다.(ex 전화번호 형식 확인)

숫자 3자리 - 숫자 4자리 - 숫자 4자리의 형식으로 패턴을 정의한 것. 이렇게 정의한 후
test메서드에 검사하고자 하는 문자열을 인자로 전달하면 패턴과 맞는지 확인하고 boolean값을 반환한다.

생성

    a. /is/i
        i. /는 시작과 종료기호, / /사이에는 패턴, i는 플래그를 의미한다.
    b. new RegExp(/is/i)

메서드

    a. RegExp.prototype.exec : 매칭결과를 배열로 반환
    b. RegExp.prototype.test : 매칭결과를 불리언값으로 반환
    c. RegExp.prototype.match : 매칭 결과를 배열로 반환, 다만 exec는 g플래그를 지정해도 첫 번째 매칭 결과만 반환하지만, match는 g 플래그가 지정되면 모든 매칭 결과를 배열로 반환한다.

플래그

    a. g : Global. 대상 문자열 내에서 패턴과 일치하는 모든 문자열을 전역 검색
    b. I : ignore case. 대소문자 구별하지 않고 패턴을 검색
    c. m : Multi line. 문자열의 행이 바뀌더라도 계속해서 패턴 검색

패턴

    a. 임의의 문자열 검색 : .은 임의의 문자 한 개를 의미한다. ..이면 두 자리, ...이면 세 자리 문자열과 매치한다.
    const target = "Hi, I'm woong's freind";
    const regExp = /..../g;
    target.match(regExp); //[ 'Hi, ', "I'm ", 'woon', "g's ", 'frei' ]
    dot을 네 개 사용하면 이렇게 네 자리 문자열이 배열로 반환된다.
    b. 반복검색 : 
        i. {m,n}은 중괄호 앞에 위치한 문자열이 최소m번, 최대 n번 반복되는 문자열을 검색한다.
        const target = "a aa aaa ababaa";
        const regExp = /a{2,3}/g;
        const result = target.match(regExp);//[ 'aa', 'aaa', 'aa' ]
        ii. {n}은 n번 반복되는 문자열, {n, }은 앞선 패턴이 최소 n번 이상 반복되는 문자열을 뜻한다.
        iii. +는 최소 한 번 이상 반복되는 문자열을 의미한다. A+면 A가 한 번 이상 반복되는 문자열을 뜻함. {1, }과 같다.
        iv. ?는 앞선 패턴이 최소 0번, 최대 한 번 반복되는 문자열을 의미한다. 물음표 앞의 단어 하나에만 적용이 된다.
        const target = "a aa aaba ababaa";
        const regExp = /aab?/g;
        const result = target.match(regExp); //[ 'aa', 'aab', 'aa' ]
    c. OR검색
        i. |는 앞의 패턴 또는 뒤의 패턴을 매치한다. 앞에 거 따로, 뒤에 거 따로 매치하는 거임.
        const target = "a aa aaba ababaa";
        const regExp = /aa|b/g;
        const result = target.match(regExp); //[ 'aa', 'aa', 'b', 'b', 'b', 'aa' ]
        ii. [ ] 안에 있는 문자는 모두 or로 동작된다.
        const target = "a b aaba";
        const regExp = /[aab]/g;
        const result = target.match(regExp); //[ 'a', 'b', 'a', 'a', 'b', 'a' ]
        [ ] +를 사용하면 a+|b+와 [ab]+는 같은 결과를 낸다. 하지만 특이하게도 [aab]+이렇게 하면 aab도 또 포함이 되나보다.. aa+| b+하면 이런 결과가 나오지 않는다. 
        const target = "aa b aaba";
        const regExp = /[aab]+/g;
        const result = target.match(regExp); //[ 'aa', 'b', 'aaba' ]
        iii. 범위설정은 [ ] 안에 -를 사용한다. [A-Z] 이런식으로.
        iv. 대소문자 구별없이 알파벳 검색하기 : /[A-Za-z]+/g
        v. 숫자검색하기 : /[0-9]+/g , 만약 숫자의 표기를 위해 쉼표가 있다면 /[0-9,]+
        vi. 숫자검색하기2 : /[\d,]+/g, \d는 숫자를 의미한다. \D는 숫자가 아닌 문자를 의미.
        vii. 알파벳,숫자,언더스코어 : /[\w,]+/g 이건 [A-Za-z0-9_]와 같다.
    d. NOT 검색
        i. [ ] 내의 ^은 not의 의미를 지닌다. [^0-9]는 숫자를 제외한 문자를 의미한다.
    e. 시작위치로 검색
        i. [ ] 밖의 ^은 문자열의 시작을 의미한다. /^https/는 문자열이 https로 시작하는지 검사한다.
    f. 마지막 위치로 검색
        i. /com$/은 com으로 끝나는지 검사한다.

자주 사용하는 정규표현식

    a. 특정 단어로 시작하는지 검사
    b. 특정 단어로 끝나는지 검사
    c. 숫자로만 이루어진 문자열인지 검사
        i. ex) /^\d+$/  : ^는 문자의 시작, $는 마지막을 의미하고 \d는 순자를 의미한다. 그러니까 숫자로 시작하고 숫자로 끝나야 하는데, +가 있으니 숫자 한 개가 아닌 숫자가 한 번 이상 반복되는 문자열을 매칭한다.
    d. 하나 이상의 공백으로 시작하는지 검사
        i. /^[\s]+/ : \s는 공백문자를 뜻한다.[\t\r\n\v\f]와 같다.
    e. 아이디로 사용 가능한지 검사
        i. 문자열이 알파벳 대소문자 또는 숫자로 시작하고 끝나며 4~10자리인지 검사하기
        /^[A-Za-z0-9]{4,10}$/
    f. 메일주소 형식에 맞는지 검사
    g. 핸드폰 번호 형식에 맞는지 검사

특수문자 포함여부 검사