정규표현식

LEE JI YOUNG·2022년 4월 12일
0

JS/Node

목록 보기
20/23

[자바스크립트] 정규표현식(Regular Expression) 기초/기본 쉽고 상세한 사용 방법 정리(샘플 예제 코드)

쉬운정리!!! - 참고

정규 표현식 만들기

  • 정규 표현식 리터럴은 스크립트를 불러올 때 컴파일되므로, 바뀔 일이 없는 패턴의 경우 리터럴을 사용하면 성능이 향상될 수 있습니다.
    const re = /ab+c/

  • RegExp 객체의 생성자 호출 : 생성자 함수를 사용하면 정규 표현식이 런타임에 컴파일됩니다. 바뀔 수 있는 패턴이나, 사용자 입력 등 외부 출처에서 가져오는 패턴의 경우 이렇게 사용.
    const re = new RegExp('ab+c')

정규 표현식 패턴 작성하기

단순 패턴 사용하기

: 단순 패턴은 문자열을 있는 그대로 탐색할 때 사용
/abc/ ==> 정확한 순서로 "abc" 라는 문자의 조합이 나타나는 부분과 일치. "ab c"는 일치하는 것이 아니다.

특수 문자 사용하기

: 직접적인 일치 이상의 탐색이 필요할 때 사용 : 하나 이상의 "b"를 찾는다거나 공백 문자를 찾는 등...

  • 하나의 "a" 이후에 0개 이상의 "b", 그 뒤의 "c""와 일치해야 하면 /abc/ 패턴을 사용
    : "b" 뒤의
    *는 이전 항목의 0번 이상 반복을 의미. 이 패턴을 문자열 "cbbabbbbcdebc"에 대해 사용하면, 일치하는 부분 문자열은 "abbbbc"

JavaScript에서 정규 표현식 사용하기

정규표현식 정리

()

패턴들을 하나의 그룹으로 묶음

+

기호 앞의 패턴이 1번 이상 발생하는 패턴, 꼭 나타나야함.

ex) ^\S+ 라면 (공백없는 텍스트로 시작하고, 한글자 이상의 길이)

?

기호 앞의 패턴이 없거나 1번 발생하는 패턴 -> 0번 or 1번

*

기호 앞의 패턴이 없거나 1번 이상 발생하는 패턴 -> 0번 or 1번 이상 가능

.

모든 문자를 가리킴(\과 개행은 제외)

^

문자열(패턴)이나 행의 처음을 의미

$

문자열 (패턴)이나 행의 종료를 알린다.

[]

[] 사이에 들어간 문자 중 하나를 매치

[0-9a-zA-Z] -> 0-9, 소문자, 대문자 중 하나를 매치함을 의미한다.

[^ ]

[]의 부정을 의미

\s

공백문자

\S

공백을 제외한 나머지 문자들 (공백 없는 텍스트 일 때 사용하게 된다.)

\w

"_"를 포함한, 영어와 숫자들

\W

"_"를 제외한, 영어와 숫자가 아닌 문자열들과 일치

\d

숫자를 일치시킨다.

[0-9]와 동일

\D

숫자가 아닌 모든 문자

{N}

정확히 N번 발생

{M,N}

최소 M번 이상, 최대 N번 이하로 발생하는 패턴

|

or연산을 의미한다. 예를 들어, (txt, doc)는 txt 또는 doc을 의미한다.

{N|M} -> N번 혹은 M번 발생

(?!)

대소문자를 구분하지 않음.


프로그래머스 Lv1 - 신규 아이디 추천

function solution(new_id) {
    const answer = new_id
        .toLowerCase() // 1
        .replace(/[^\w-_.]/g, '') // 2
        .replace(/\.+/g, '.') // 3
        .replace(/^\.|\.$/g, '') // 4
        .replace(/^$/, 'a') // 5
        .slice(0, 15).replace(/\.$/, ''); // 6
    const len = answer.length;
    return len > 2 ? answer : answer + answer.charAt(len - 1).repeat(3 - len);
}

프로그래머스 Lv1 - [카카오 인턴] 키패드 누르기

function solution(numbers, hand) {
  hand = hand[0] === "r" ? "R" : "L"
  let position = [1, 4, 4, 4, 3, 3, 3, 2, 2, 2]
  let h = { L: [1, 1], R: [1, 1] }
  return numbers.map(x => {
    if (/[147]/.test(x)) {
      h.L = [position[x], 1]
      return "L"
    }
    if (/[369]/.test(x)) {
      h.R = [position[x], 1]
      return "R"
    }
    let distL = Math.abs(position[x] - h.L[0]) + h.L[1]
    let distR = Math.abs(position[x] - h.R[0]) + h.R[1]
    if (distL === distR) {
      h[hand] = [position[x], 0]
      return hand
    }
    if (distL < distR) {
      h.L = [position[x], 0]
      return "L"
    }
    h.R = [position[x], 0]
    return "R"
  }).join("")
}
profile
프론트엔드 개발자

0개의 댓글