본문 바로가기
C.W.K.
Stream
Lesson 06 of 10 · published

JavaScript 플래그 깊이

~8 min · javascript, flags

Level 0패턴 호기심
0 XP0/90 lessons0/15 achievements
0/100 XP to next level100 XP to go0% complete

플래그는 패턴 전체의 동작을 바꿔

ES2024의 JavaScript 정규식에는 다음 여덟 플래그가 있어.

  • i는 대소문자를 구분하지 않고
  • g는 첫 매칭에서 멈추지 않고 다음 매칭을 계속 찾고
  • m^$가 각 줄의 경계도 보게 하고
  • s.이 줄바꿈까지 매칭하게 해.
  • u는 패턴과 입력을 유니코드 코드 포인트 기준으로 다루고
  • ylastIndex 위치에서만 매칭을 시작하고
  • d는 일치 객체에 그룹별 시작·끝 위치를 넣고
  • v는 확장된 유니코드 집합 문법을 활성화해.

플래그 순서는 상관없지만 조합에는 규칙이 있어

/pattern/gimsu처럼 여러 플래그를 이어 붙일 수 있고 순서는 결과를 바꾸지 않아. 같은 플래그를 두 번 쓰면 오류가 나고, uv도 함께 사용할 수 없어. vu의 유니코드 인식 동작을 확장하는 별도 모드라 둘 가운데 하나를 골라야 해.

유니코드 텍스트에는 /u/v를 명시해

둘 다 없으면 보조 평면의 이모지 같은 문자가 서로게이트 두 개로 보일 수 있어. /u를 사용하면 .이 이런 문자를 코드 포인트 하나로 다루고 \p{...} 속성 이스케이프도 사용할 수 있어.

/y는 현재 위치에서 벗어나지 않아

전역 검색은 현재 위치에서 실패하면 뒤쪽 위치를 계속 찾지만, 고정 위치 검색은 정확히 lastIndex에서만 시도해. 입력을 앞에서부터 빠짐없이 소비해야 하는 토크나이저에서 이 차이가 유용해.

Code

JavaScript 플래그 실전·js
// Case-insensitive
'Hello'.match(/hello/i)  // ['Hello']

// Multiline — 줄 단위 ^/$
const log = 'line1\nERROR\nline3';
log.match(/^ERROR$/m)  // ['ERROR']
log.match(/^ERROR$/)   // null (전체 문자열이 ERROR 아님)

// dotAll — . 가 줄바꿈 매칭
'a\nb'.match(/a.b/s)  // ['a\nb']
'a\nb'.match(/a.b/)   // null

// Unicode — emoji 한 글자
'\u{1F4A1}'.match(/.+/u)   // ['💡']
'\u{1F4A1}'.length         // 2 (u 플래그 없이 surrogate pair)

// Unicode property escape (/u 필수)
'안녕 hello'.match(/\p{Script=Hangul}+/gu)
// ['안녕']

// Indices 플래그 (/d) — 정확한 위치
const m = 'hello world'.match(/world/d);
m.indices  // [[6, 11]]

External links

Exercise

JavaScript 콘솔에서 💡(U+1F4A1)을 /^.$//^.$/u에 각각 대입해. 첫 패턴은 실패하고 둘째는 성공하는 이유를 UTF-16 서로게이트 쌍과 유니코드 코드 포인트의 차이로 설명해.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.