반응형
Jake Seo
제이크서 위키 블로그
Jake Seo
전체 방문자
오늘
어제
  • 분류 전체보기 (715)
    • 일상, 일기 (0)
    • 백준 문제풀이 (1)
    • 릿코드 문제풀이 (2)
    • 알고리즘 이론 (10)
      • 기본 이론 (2)
      • 배열과 문자열 (8)
    • 데이터베이스 (15)
      • Planet Scale (1)
      • MSSQL (9)
      • 디비 기본 개념 (1)
      • SQLite 직접 만들어보기 (4)
    • 보안 (7)
    • 설계 (1)
    • 네트워크 (17)
      • HTTP (9)
      • OSI Layers (5)
    • 회고 (31)
      • 연간 회고 (2)
      • 주간 회고 (29)
    • 인프라 (52)
      • 도커 (12)
      • AWS (9)
      • 용어 (21)
      • 웹 성능 (1)
      • 대규모 서비스를 지탱하는 기술 (9)
    • 깃 (7)
    • 빌드 도구 (7)
      • 메이븐 (6)
      • 그레이들 (0)
    • Java (135)
      • 이펙티브 자바 (73)
      • 자바 API (4)
      • 자바 잡지식 (30)
      • 자바 디자인 패턴 (21)
      • 톰캣 (Tomcat) (7)
    • 프레임워크 (64)
      • next.js (14)
      • 스프링 프레임워크 (28)
      • 토비의 스프링 (6)
      • 스프링 부트 (3)
      • JPA (Java Persistence API) (5)
      • Nest.js (8)
    • 프론트엔드 (48)
      • 다크모드 (1)
      • 노드 패키지 관리 매니저 (3)
      • CSS (19)
      • Web API (11)
      • tailwind-css (1)
      • React (5)
      • React 새 공식문서 요약 (1)
      • HTML (Markup Language) (5)
    • 자바스크립트 (108)
      • 모던 자바스크립트 (31)
      • 개념 (31)
      • 정규표현식 (5)
      • 코드 스니펫 (1)
      • 라이브러리 (6)
      • 인터뷰 (24)
      • 웹개발자를 위한 자바스크립트의 모든 것 (6)
      • 팁 (2)
    • Typescript (49)
    • 리눅스와 유닉스 (10)
    • Computer Science (1)
      • Compiler (1)
    • IDE (3)
      • VSCODE (1)
      • IntelliJ (2)
    • 세미나 & 컨퍼런스 (1)
    • 용어 (개발용어) (16)
      • 함수형 프로그래밍 용어들 (1)
    • ORM (2)
      • Prisma (2)
    • NODEJS (2)
    • cypress (1)
    • 리액트 네이티브 (React Native) (31)
    • 러스트 (Rust) (15)
    • 코틀린 (Kotlin) (4)
      • 자바에서 코틀린으로 (4)
    • 정규표현식 (3)
    • 구글 애널리틱스 (GA) (1)
    • SEO (2)
    • UML (2)
    • 맛탐험 (2)
    • 리팩토링 (1)
    • 서평 (2)
    • 소프트웨어 공학 (18)
      • 테스팅 (16)
      • 개발 프로세스 (1)
    • 교육학 (1)
    • 삶의 지혜, 통찰 (1)
    • Chat GPT (2)
    • 쉘스크립트 (1)
    • 컴파일 (2)
    • Dart (12)
    • 코드팩토리의 플러터 프로그래밍 (4)
    • 플러터 (17)
    • 안드로이드 스튜디오 (1)
    • 윈도우즈 (1)
    • 잡다한 백엔드 지식 (1)
    • 디자인 패턴 (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 객체복사
  • 슬로우 쿼리
  • 도커공식문서
  • 자바스크립트 면접
  • 자바스크립트 인터뷰
  • 서버리스 컴퓨팅
  • 느린 쿼리
  • try-with-resources
  • rust
  • next js app
  • 싱글턴
  • 외래키 제약조건
  • 알고리즘
  • 자바
  • item9
  • 플라이웨이트패턴
  • item7
  • Javadoc 자바독 자바주석 주석 Comment
  • 싱글톤
  • 자바 디자인패턴
  • pnpm
  • Next.js
  • 메이븐 골
  • 이펙티브 자바 item9
  • 메이븐 라이프사이클
  • Java
  • Pre-rendering
  • 스프링 검증
  • item8
  • 이펙티브자바
  • 토비의 스프링
  • 자바스크립트
  • 자료구조
  • 메이븐 페이즈
  • MSSQL
  • 디자인패턴
  • serverless computing
  • 프로그래머의 뇌
  • 이펙티브 자바
  • 빈 검증
  • 참조 해제
  • prerendering
  • 자바 검증
  • 러스트
  • 작업기억공간
  • 싱글톤 패턴
  • 팩터리 메서드 패턴
  • bean Validation
  • 추상 팩터리 패턴
  • NEXT JS

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
Jake Seo

제이크서 위키 블로그

자바스크립트/정규표현식

정규표현식의 플래그란? (what is flag in regular expression?)

2023. 4. 5. 22:44

정규표현식의 플래그란? (Regular Expression flags)

  • 플래그로 정규표현식의 동작방식을 변경할 수 있다.
    • 정규표현식 전체의 동작방식에 영향을 미친다.
  • /regex/flags
    • regex 자리에 정규표현식 패턴이 오고, flags 에 플래그가 온다.
  • 플래그(flags)는 modifiers 라고 불리기도 한다.

플래그의 종류

  • g (global)
  • i (case-insensitive)
  • m (multiline)
  • s (dotall)
  • u (unicode)
  • y (sticky)

g (global) 플래그 설명과 예제

  • 정규표현식의 기본 동작은 입력 문자열에서 매칭된 첫번째 케이스만을 찾아낸다.
  • g (global) 플래그는 모든 케이스를 찾아내도록 한다.

g 플래그를 적용하지 않는다면

  • 입력된 문자열: hello hello world
  • 입력된 정규식: /hello/
  • 매칭된 부분: hello
    • 첫번째 매칭 케이스를 매칭하고 멈춘다.

g 플래그를 적용한다면

  • 입력된 문자열: hello hello world
  • 입력된 정규식: /hello/g
  • 매칭된 부분: hello hello
    • 첫번째 매칭 케이스만 매칭하고 멈추지 않고 전체 매칭 케이스를 찾아낸다.

i (case-insensitive) 플래그 설명과 예제

  • i (case-insensitive) 플래그는 패턴에서 대소문자 구분을 무시한다.

i 플래그를 적용하지 않는다면

  • 입력된 문자열: hello Hello world
  • 입력된 정규식: /hello/g
  • 매칭된 부분: hello
    • g 플래그가 적용됐음에도 소문자 hello 만 매칭된다.

i 플래그를 적용한다면

  • 입력된 문자열: hello Hello world
  • 입력된 정규식: /hello/gi
  • 매칭된 부분: hello Hello
    • 대소문자 구분없이 hello 와 Hello 가 전부 매칭된다.

m (multiline) 플래그 설명과 예제

  • m (multiline) 플래그는 ^ 와 $ 사용에 연관이 있다.
  • ^ 와 $ 는 특정 패턴으로 시작하거나 끝나는 경우 매칭된다.
  • ^ 와 $ 의 기본 동작은 문자열이 몇줄로 되어있건 하나의 큰 문자열로 친다.
    • 그래서 각각 줄마다 시작과 끝을 보지 않고 전체 문자의 시작과 끝만 본다.
  • m (multiline) 플래그를 사용하면 각각의 줄에서의 시작과 끝이 모두 매칭된다.

m 플래그를 적용하지 않는다면

  • 입력된 문자열
hello world
hello universe
  • 입력된 정규식: /^hello/g
  • 매칭된 부분: hello
    • 두 줄 다 hello 로 시작하지만 하나밖에 매칭시키지 못한다.

m 플래그를 적용한다면

  • 입력된 문자열
hello world
hello universe
  • 입력된 정규식: /^hello/gm
  • 매칭된 부분: hello, hello
    • 각각의 줄을 따로 고려하기 때문에 hello, hello 두개가 매칭된다.

s (dotall) 플래그 설명과 예제

  • . 의 기본 동작은 개행문자 (\n) 를 매칭시키지 않는다.
  • s (dotall) 플래그를 사용하면 메타 문자열인 . 이 개행문자 (\n) 까지 매칭하도록 동작을 변경한다.

s 플래그를 적용하지 않는다면

  • 입력된 문자열
hello
world
  • 입력된 정규식: /hello.*world/g
  • 매칭된 부분: 없음
    • . 의 기본 동작은 개행문자를 포함하지 않으므로 매칭된 부분이 없다.

s 플래그를 적용한다면

  • 입력된 문자열
hello
world
  • 입력된 정규식: /hello.*world/gs
  • 매칭된 부분: 입력된 문자열 전체 가 매칭된다.
    • s 플래그 때문에 . 이 개행문자를 포함하게 돼서이다.

u (unicode) 플래그 설명과 예제

  • u (unicode) 플래그를 사용하면 유니코드 모드를 활성화시킨다.
  • 유니코드 모드를 활성화시키면 \p{유니코드 카테고리} 혹은 \P{유니코드 카테고리} 문법 이용이 가능해진다.
    • \p{X} 는 {X} 라는 {유니코드 카테고리} 를 매칭하는 것이다.
    • \P{X} 는 {X} 라는 {유니코드 카테고리} 를 제외하고 매칭하는 것이다.
  • \p{L} 를 사용하면 특수문자가 아닌 글자(Letter)가 매칭된다.
  • \p{Emoji} 를 사용하면 이모티콘이 매칭된다.
  • 메인 카테고리와 서브 카테고리에 대해 이 링크 마지막 부분쯤에 상세히 나와있다.

u 플래그를 적용하지 않는다면

u 플래그를 설명하려면, 요구사항이 있는 예제가 적절하다.

  • 요구사항: 특수문자를 제외하고 나머지만 뽑아내라
  • 입력된 문자열
-h-e-l-l-o-안-녕-하-세-요-
  • 입력된 정규식: /[a-zA-Zㄱ-힣]/g
    • 유니코드 range 를 주기 위해 위와 같은 정규식이 도출됐다.
  • 매칭된 부분: hello안녕하세요
  • 이 케이스의 요구사항에 대해서는 충분히 올바른 답을 끌어냈지만, 제3외국어가 등장한다면 또 케이스를 추가해야 한다.
    • -h-e-l-l-o-안-녕-하-세-요-世-界-こ-ん-に-ち-は-ü-ç-! 이 케이스에 대응할 수 없다.

u 플래그를 적용한다면

  • 요구사항: 특수문자를 제외하고 나머지만 뽑아내라
  • 입력된 문자열
-h-e-l-l-o-안-녕-하-세-요-世-界-こ-ん-に-ち-は-ü-ç-!
  • 입력된 정규식: /\p{L}/gu
  • 매칭된 부분: hello안녕하세요世界こんにちはüç
  • 제3외국어가 추가되더라도 올바른 답을 끌어낼 수 있다.
  • 정규표현식 패턴 자체가 엄청 간결해지기도 한다.

다른 예제 케이스

  • \p{Emoji}: 이모지만 추출하기
    • \P{Emoji}: 이모지만 빼고 추출하기
  • \p{N} or \p{digit}: 숫자만 추출하기
    • \P{N} or \P{digit}: 숫자만 추출하기

p 와 P 를 자유롭게 변경하며 응용이 가능하다.

y (sticky) 플래그 설명과 예제

  • y 플래그는 소비된 시작 위치를 주입하고, 해당 위치에 정확히 패턴이 있는지를 검사할 수 있게 해준다.
    • 자바스크립트 정규표현식 객체에는 lastIndex 라는 속성이 존재한다.
    • lastIndex 는 내가 문자열을 어디까지 소비했는지 위치를 기억하는 속성이다.
    • 정규표현식은 글자가 패턴에 맞는지 확인하며 글자를 소비한다.
      • 소비한다는 것은 lastIndex 를 늘려가 더이상 뒤의 글자를 보지 않음을 의미한다.
      • lastIndex 는 내가 글자를 어디까지 소비했는지에 대한 위치로 볼 수 있다.
    • lastIndex 속성에 지정된 정확한 위치에서 패턴 매칭을 시작하도록 한다.

y 플래그를 적용하지 않는다면

예제의 출처: javascript.info/regexp-sticky

let str = 'let varName = "value"';

let regexp = /\w+/;

regexp.lastIndex = 3;
console.log(regexp.exec(str)); // ['let', index: 0, input: 'let varName = "value"', groups: undefined]

regexp.lastIndex = 4;
console.log(regexp.exec(str)); // ['let', index: 0, input: 'let varName = "value"', groups: undefined]

y 플래그를 적용한다면

let str = 'let varName = "value"';

let regexp = /\w+/y;

regexp.lastIndex = 3;
console.log(regexp.exec(str)); // null

regexp.lastIndex = 4;
console.log(regexp.exec(str)); // ['varName', index: 4, input: 'let varName = "value"', groups: undefined]
  • 정확히 4번째 인덱스의 문자까지 소비한 이후로 시작 위치를 고정한 뒤에 패턴에 매칭되는 케이스가 있는지 확인한다.
  • 3번째 인덱스의 문자까지 소비한 이후엔 공백이 나오기 때문에 일치하는게 없어서 null 이 로깅된다.
반응형
저작자표시 비영리 (새창열림)

'자바스크립트 > 정규표현식' 카테고리의 다른 글

정규표현식 (Regular Expression) 이란?  (0) 2023.04.03
자바스크립트 replace 메서드 정규식 특수 대체 패턴  (0) 2023.03.10
자바스크립트 정규표현식, named capturing group 이란?  (0) 2023.03.06
자바스크립트 정규 표현식, exec() 메서드란?  (0) 2023.03.06
    '자바스크립트/정규표현식' 카테고리의 다른 글
    • 정규표현식 (Regular Expression) 이란?
    • 자바스크립트 replace 메서드 정규식 특수 대체 패턴
    • 자바스크립트 정규표현식, named capturing group 이란?
    • 자바스크립트 정규 표현식, exec() 메서드란?
    Jake Seo
    Jake Seo
    ✔ 잘 보셨다면 광고 한번 클릭해주시면 큰 힘이 됩니다. ✔ 댓글로 틀린 부분을 지적해주시면 기분 나빠하지 않고 수정합니다. ✔ 많은 퇴고를 거친 글이 좋은 글이 된다고 생각합니다. ✔ 간결하고 명료하게 사람들을 이해 시키는 것을 목표로 합니다.

    티스토리툴바