정규 표현식

윤뿔소·2024년 7월 17일
0

CS 지식 / 다양한 팁

목록 보기
16/20
post-thumbnail

정규 표현식 (Regex)

문자열을 검색하고 조작하는 데 사용되는 좋은 도구입니다. 정규 표현식은 특정한 패턴을 정의하여 문자열을 매칭하거나 대체하는 작업을 수행할 수 있습니다. 자주 사용되는 정규 표현식 패턴은 다음과 같습니다.

문법

  • .: 임의의 한 문자
  • ``: 앞의 패턴이 0번 이상 반복
  • +: 앞의 패턴이 1번 이상 반복
  • ?: 앞의 패턴이 0번 또는 1번 반복
  • \\d: 숫자 문자
  • \\w: 단어 문자 (알파벳, 숫자, 밑줄)
  • \\s: 공백 문자 (스페이스, 탭, 줄 바꿈)
  • [abc]: a, b, c 중 하나의 문자
  • [^abc]: a, b, c가 아닌 문자
  • |: OR 연산자
  • (...): 그룹화
  • ^: 문자열의 시작
  • $: 문자열의 끝

등등..

정규 표현식을 사용하여 XML 태그 및 속성을 파싱할 수 있습니다.

예시

태그의 속성을 추출하는 정규 표현식은 다음과 같습니다.

const attrRegex = /([a-zA-Z_:][-a-zA-Z0-9_:.]*)\\s*=\\s*"([^"]*)"/g;

이 정규 표현식은 속성 이름과 값을 추출하는데 사용됩니다.

  1. / /

    • 정규 표현식의 시작과 끝을 나타냅니다.
  2. ([a-zA-Z_:][-a-zA-Z0-9_:.]*)

    • 이 부분은 속성 이름을 캡처합니다.
    • ([a-zA-Z_:]): 대괄호 안의 문자는 속성 이름의 첫 번째 문자를 나타내며, 영어 대문자와 소문자, 밑줄(_), 그리고 콜론(:)을 포함합니다.
    • ([-a-zA-Z0-9_:.]*): 대괄호 안의 문자는 속성 이름의 나머지 문자를 나타내며, 영어 대문자와 소문자, 숫자, 밑줄(_), 하이픈(-), 콜론(:), 그리고 점(.)을 포함합니다. *는 이 문자가 0번 이상 반복됨을 의미합니다.
    • 따라서 ([a-zA-Z_:][-a-zA-Z0-9_:.]*)는 HTML 속성 이름에 해당하는 부분을 캡처합니다.
  3. \s*=\s*

    • \s*: 0개 이상의 공백 문자를 나타냅니다.
    • =: 등호 문자를 나타냅니다.
    • \s*: 0개 이상의 공백 문자를 나타냅니다.
    • 따라서 \s*=\s*는 속성 이름과 속성 값 사이의 등호를 포함한 공백을 허용합니다.
  4. "([^"]*)"

    • ": 큰따옴표를 나타냅니다.
    • ([^"]*): 큰따옴표로 끝나지 않는 0개 이상의 문자를 나타내며, 속성 값을 캡처합니다. 대괄호 안의 ^는 not을 의미하여 큰따옴표를 제외한 모든 문자를 포함합니다.
    • ": 큰따옴표를 나타냅니다.
    • 따라서 "([^"]*)"는 큰따옴표로 둘러싸인 속성 값을 캡처합니다.
  5. g

    • 전역 검색을 나타내며, 문자열 내의 모든 일치 항목을 찾습니다.

정규표현식과 같이 쓸 수 있는 match

  1. 루트 디렉토리 매칭
const rootMatch = this.pathString.match(/^([a-zA-Z]:\\\\|\\/)/);
  • ^: 문자열의 시작을 의미.
  • ([a-zA-Z]:\\\\|\\/): 대소문자 알파벳 문자로 시작하는 드라이브 문자(예: C:)와 그 뒤에 오는 백슬래시(\\) 또는 슬래시(/)를 의미.
  1. 파일 확장자 매칭
const extMatch = lastComponent.match(/(\\.[^\\.]+)$/);
  • (\\.[^\\.]+): 점(.)으로 시작하고 점(.)이 아닌 문자로 이루어진 문자열을 의미. .이 있으면 확장자로 가져옴.
  • $: 문자열의 끝을 의미. 이는 확장자가 파일명 끝에 위치해야 한다는 것을 나타냄.

정규 표현식 Cheet Sheet

가장 많이 사용되는 정규 표현식 패턴 순으로 정리한 치트 시트를 보여드리겠습니다. 각 패턴과 그 용도를 포함하여 정리하였습니다.

기본 패턴

  • .: 임의의 한 문자 (줄바꿈 문자는 제외)

    • 예: a.b는 "aab", "acb" 등과 일치
  • ^: 문자열의 시작

    • 예: ^abc는 "abcdef"와 일치
  • $: 문자열의 끝

    • 예: abc$는 "defabc"와 일치
  • *: 앞의 패턴이 0번 이상 반복

    • 예: ab*c는 "ac", "abc", "abbc" 등과 일치
  • +: 앞의 패턴이 1번 이상 반복

    • 예: ab+c는 "abc", "abbc" 등과 일치하지만 "ac"는 일치하지 않음
  • ?: 앞의 패턴이 0번 또는 1번 반복

    • 예: ab?c는 "ac"와 "abc"에 일치
  • |: OR 연산자

    • 예: a|b는 "a" 또는 "b"와 일치
  • (...): 그룹화

    • 예: (abc)+는 "abc", "abcabc" 등과 일치

문자 클래스

  • [abc]: a, b, c 중 하나의 문자

    • 예: [abc]는 "a", "b", "c" 중 하나에 일치
  • [^abc]: a, b, c가 아닌 문자

    • 예: [^abc]는 "d", "e" 등과 일치하지만 "a", "b", "c"는 제외
  • [a-z]: a에서 z까지의 소문자 중 하나

    • 예: [a-z]는 "a", "b", ..., "z"와 일치
  • [A-Z]: A에서 Z까지의 대문자 중 하나

    • 예: [A-Z]는 "A", "B", ..., "Z"와 일치
  • [0-9]: 0에서 9까지의 숫자 중 하나

    • 예: [0-9]는 "0", "1", ..., "9"와 일치

특수 문자 클래스

  • \d: 숫자 문자 [0-9]

    • 예: \d는 "0", "1", ..., "9"와 일치
  • \D: 숫자가 아닌 문자

    • 예: \D는 숫자가 아닌 모든 문자와 일치
  • \w: 단어 문자 (알파벳, 숫자, 밑줄)

    • 예: \w는 "a", "b", ..., "z", "A", "B", ..., "Z", "0", "1", ..., "9", "_"와 일치
  • \W: 단어 문자가 아닌 문자

    • 예: \W는 단어 문자가 아닌 모든 문자와 일치
  • \s: 공백 문자 (스페이스, 탭, 줄 바꿈)

    • 예: \s는 공백 문자와 일치
  • \S: 공백 문자가 아닌 문자

    • 예: \S는 공백 문자가 아닌 모든 문자와 일치

앵커와 경계

  • \b: 단어 경계

    • 예: \bword\b는 "word"와 일치하지만 "sword"나 "wording"과는 일치하지 않음
  • \B: 단어 경계가 아님

    • 예: \Bword\B는 "swording" 등과 일치하지만 "word"와는 일치하지 않음

반복 패턴

  • {n}: 정확히 n번 반복

    • 예: a{3}는 "aaa"와 일치
  • {n,}: n번 이상 반복

    • 예: a{2,}는 "aa", "aaa", "aaaa" 등과 일치
  • {n,m}: n번 이상 m번 이하 반복

    • 예: a{2,3}는 "aa", "aaa"와 일치하지만 "a", "aaaa"는 일치하지 않음

활용 예시

  1. 이메일 주소 검증:

    /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/
  2. 전화번호 형식:

    /^\d{3}-\d{3,4}-\d{4}$/
  3. URL 검증:

    /^(https?|ftp):\/\/[^\s/$.?#].[^\s]*$/
  4. 우편번호 (한국):

    /^\d{3}-\d{3}$/
  5. 날짜 형식 (YYYY-MM-DD):

    /^\d{4}-\d{2}-\d{2}$/
profile
코뿔소처럼 저돌적으로

0개의 댓글