깊은바다거북
개발 공부 기록
깊은바다거북
전체 방문자
오늘
어제
  • 분류 전체보기 (219)
    • JAVA (9)
    • JavaScript (15)
    • 스파르타코딩클럽 (11)
      • [내일배움단] 웹개발 종합반 개발일지 (5)
      • [내일배움캠프] 프로젝트와 트러블 슈팅 (6)
    • SQL | NoSQL (4)
    • CS 등등 (0)
    • TIL | WIL (173)
    • 기타 에러 해결 (3)
    • 내 살 길 궁리 (4)

인기 글

최근 글

최근 댓글

태그

  • 팀 프로젝트
  • Backtracking(백트래킹)
  • Leetcode
  • TIT (Today I Troubleshot)
  • Linked List
  • Binary Tree(이진 트리)
  • 최소 힙(Min Heap)
  • 01. 미니 프로젝트
  • 혼자 공부하는 자바스크립트
  • 프로그래머스
  • 점화식(Recurrence Relation)
  • 재귀 함수
  • 자바스크립트 기초 문법
  • DFS(깊이우선탐색)
  • POST / GET 요청
  • Inorder Traversal(중위 순회)
  • 트러블 슈팅 Troubleshooting
  • 시간 복잡도
  • 자잘한 에러 해결
  • Trie
  • BFS(너비우선탐색)
  • TypeScript
  • BST(이진 탐색 트리)
  • tree
  • 자료 구조
  • Preorder Traversal(전위 순회)
  • leetcode-cli
  • 최대 힙(Max Heap)
  • 코딩테스트 연습문제
  • Til
hELLO · Designed By 정상우.
깊은바다거북

개발 공부 기록

TIL | WIL

4/25 화 (정규표현식) TIL

2023. 4. 25. 21:53

정규 표현식 (Regular Expression)

: 문자열을 처리하는 방법 중의 하나로 특정한 조건의 문자를 '검색'하거나 '치환'하는 과정을 매우 간편하게 처리 할 수 있도록 하는 수단.

: 문자열에서 특정한 문자를 찾아내는 도구.

: 일정한 패턴을 가진 문자열의 집합을 표현하기 위해 사용하는 형식 언어.

문자열을 대상으로 패턴 매칭 기능을 제공함.

패턴 매칭 기능

: 특정 패턴과 일치하는 문자열을 검색하거나 추출 또는 치환할 수 있는 기능.

예시) 유효한 휴대폰 전화번호인지 체크하기

// 사용자로부터 입력받은 휴대폰 전화번호
const tel = '010-1234-567팔';

// 정규 표현식 리터럴로 휴대폰 전화번호 패턴을 정의한다.
const regExp = /^\d{3}-\d{4}-\d{4}$/;

// tel이 휴대폰 전화번호 패턴에 매칭하는지 테스트한다. 
regExp.test(tel); // -> false

1. 정규 표현식 생성하기

정규 표현식 객체를 생성할 땐 정규 표현식 리터럴과 RegExp 생성자 함수를 사용할 수 있다.

  1. 정규 표현식 리터럴: 패턴(”regexp”)과 플래그(”i”)로 구성됨
    const regexp = /is/i;
  1. RegExp 생성자 함수:
    const regexp = new RegExp(/is/i)
    const regexp = new RegExp(/is/, 'i');

2. RegExp 메소드

  • RegExp.prototype.exec : 패턴을 검색하여 매칭 결과를 배열로 반환. 매칭 결과가 없는 경우 null을 반환. g 플래그를 지정해도 첫 번재 매칭 결과만 반환함 주의.
// .exec()
const regExp = /is/;
const target = 'Is this all?';

regExp.exec(target); 
// => ['is', index: 5, input: 'Is this all?', groups: undefined]
  • RegExp.prototype.test : 패턴을 검색하여 매칭 결과를 불리언 값으로 반환.
    // 
    const regExp = /is/;
    const target = 'Is this all?';
    
    regExp.test(target); 
    // => true
  • String.prototype.match : 대상 문자열과 인수로 전달받은 정규 표현식과의 매칭 결과를 배열로 반환. .exec 메소드와 달리 전역 매칭을 시행할 수 있기 때문에 자주 사용된다.
    // 
    const regExp = /is/;
    const target = 'Is this all?';
    
    target.match(regExp); 
    // => ['is', index: 5, input: 'Is this all?', groups: undefined]
  • String.prototype.replace
  • String.prototype.search
  • String.prototype.split

3. 플래그

정규 표현식의 검색 방식을 설정하기 위해 사용한다.

g, i, m, u, y, ? 의 총 6개가 존재한다.

  • i = Ignore case : 대소문자를 구별하지 않고 패턴을 검색한다.
  • g = Global : 대상 문자열 내에서 패턴과 일치하는 모든 문자열을 전역 검색한다.
  • m = Multi line : 문자열의 행이 바뀌더라도 패턴 검색을 계속한다.
어떤 플래그도 사용하지 않을 경우, 기본적으로 대소문자를 구별하며 매칭 대상이 1개 이상 존재해도 첫 번째 매칭한 대상만 검색하고 종료한다.
const target = "Is this all?";

target.match(/is/);
// => ['is', index: 5, input: 'Is this all?', groups: undefined]

target.match(/is/i);
// => ['Is', index: 0, input: 'Is this all?', groups: undefined]

target.match(/is/g);
// => ['is']

target.match(/is/ig);
// => ['Is', 'is']

4. 패턴

문자열의 일정한 규칙을 표현하기 위해 사용한다.

패턴의 특징:

  • /로 열고 닫는다.
  • 따옴표는 생략한다. (따옴표 포함시 따옴표까지도 패턴에 포함해서 검색)
  • 메타문자(meta character) 또는 기호로 표현할 수 있다.
  • 어떤 문자열 내에 패턴과 일치하는 문자열이 존재할 때 ‘정규 표현식과 매치(match)한다’고 표현한다.

패턴을 표현하는 여러가지 방법

  1. 문자열 검색 : 검색하고자 하는 문자열을 그대로 사용한다.
    const target = 'Is this all?';
    
    // 'is' 문자열과 매치하는 패턴. 플래그가 생략되었으므로 대소문자를 구별한다. 
    const regExp = /is/;
    
    // target과 정규 표현식이 매치하는지 테스트한다. 
    regExp.test(target); 
    // => true
    
    // target과 정규 표현식의 매칭 결과를 구한다. 
    target.match(regExp); 
    // => ['is', index: 5, input: 'Is this all?', groups: undefined]
  1. 임의의 문자열 검색: .은 임의의 문자 한 개를 의미한다.
    const target = 'Is this all?';
    
    // 임의의 3자리 문자열을 (대소문자를 구별하여 전역으로) 검색한다.
    const regExp = /.../g;
    
    // target과 정규 표현식의 매칭 결과를 구한다. 
    target.match(regExp); 
    // => ['Is ', 'thi', 's a', 'll?']
  1. 반복 검색: {m,n}은 앞선 패턴이 최소 m번, 최대 n번 반복되는 문자열을 의미한다. 콤마 뒤에 공백이 있으면 정상 동작하지 않음 주의!
    const target = 'A AA B BB Aa Bb  AAA';
    
    const regExp = /A{1,2}/g;
    
    // target과 정규 표현식의 매칭 결과를 구한다. 
    target.match(regExp); 
    // => ['A', 'AA', 'A', 'AA', 'A']
    
    const regExp = /A{1,3}/g;
    target.match(regExp); 
    // => ['A', 'AA', 'A', 'AAA']
    • target = 'A AA B BB Aa Bb AAA AAAAA' 라면?
      const target = 'A AA B BB Aa Bb  AAA AAAAA';
      
      const regExp = /A{1,3}/g;
      target.match(regExp); 
      // => ['A', 'AA', 'A', 'AAA', 'AAA', 'AA']
      
      const regExp = /A{1,2}/g;
      target.match(regExp); 
      // => ['A', 'AA', 'A', 'AA', 'A', 'AA', 'AA', 'A']
    • {n}은 {n,n}과 같다. = 앞선 패턴이 정확히 n번 반복되는 문자열을 검색한다.
    • {n,}은 {n,∞}와 같다. = 앞선 패턴이 최소 n번 이상 반복되는 문자열을 검색한다.
    • +는 {1,∞}와 같다. = 앞선 패턴이 최소 1번 이상 반복되는 문자열을 검색한다.
    • ?는 {0,1}과 같다. = 앞선 패턴이 최대 1번 반복되는 문자열을 검색한다.
      const target = 'color colour colouuur';
      
      const regExp = /colou?r/g;
      
      // target과 정규 표현식의 매칭 결과를 구한다. 
      target.match(regExp); 
      // => ['color', 'colour']
  1. OR 검색: |은 or의 의미를 갖는다.
    const target = 'A AA B BB Aa Bb  AAA';
    
    // A 또는 B를 전역 검색한다.
    const regExp = /A|B/g;
    
    // target과 정규 표현식의 매칭 결과를 구한다. 
    target.match(regExp); 
    // => ['A', 'A', 'A', 'B', 'B', 'B', 'A', 'B', 'A', 'A', 'A']
    
    // 분해되지 않은 단어 레벨로 검색하기:
    const regExp = /A+|B+/g; // /[AB]+/와 같음. 
    target.match(regExp); 
    // => ['A', 'AA', 'B', 'BB', 'A', 'B', 'AAA']
    • [] 내의 문자는 or로 동작한다.
    • [] 내에 -를 사용하면 범위가 지정된다.
    • …
  1. NOT 검색: [ … ] 내의 ^는 not의 의미를 갖는다. /[^0-9]+/g; (숫자를 제외한 한 개 이상의 문자열 전역 검색)
  1. 시작 위치로 검색: [ … ] 밖의 ^는 문자열의 시작을 의미한다. /^https/; (’https’로 시작하는지 검사)
  1. 마지막 위치로 검색: $는 문자열의 마지막을 의미한다. /com$/; (’com’으로 끝나는지 검사)

5. 자주 사용하는 정규표현식 (문제)

  • ‘http://’ 또는 ‘https://’로 시작하는지 검사하기
  • ‘html’로 끝나는지 검사하기
  • 숫자로만 이루어진 문자열인지 검사하기
  • 하나 이상의 공백(스페이스, 탭 등)으로 시작하는지 검사하기
  • 알파벳 대소문자 또는 숫자로 시작하고 끝나며 4~10자리인지 검사하기 (아이디로 사용 가능한지 검사)
  • 핸드폰 번호 형식(000-0000-0000)에 맞는지 검사하기
  • 특수 문자 포함 여부 검사하기

(참고: 모던 자바스크립트 Deep Dive - 이웅모, 위키북스)


※ 위 내용은 스스로 공부하며 적어둔 노트이며 불확실한 내용이 있을 수 있습니다. 학습용으로 적합하지 않음을 유념해주세요. ※


Uploaded by N2T

    'TIL | WIL' 카테고리의 다른 글
    • 5/9 화 [LeetCode #26] 순서를 유지하여 배열에서 중복 숫자 제거하기 TIL
    • 5/9 화 [프로그래머스] 해시(Hash), 폰켓몬 TIL
    • 4/25 화 [프로그래머스] 해시(Hash), 완주하지 못한 선수와 Object, Map의 시간복잡도 TIL
    • 4/24 월 (클라우드 컴퓨팅의 이점과 분류) TIL
    깊은바다거북
    깊은바다거북

    티스토리툴바