자바스크립트 정규 표현식의 새로운 힘! 패턴 수정자 알아볼까요?
요즘 자바스크립트 개발하며 정규 표현식 써보면서 꿀팁 하나 알려드릴까 합니다.
바로 패턴 수정자(Regular Expression Pattern Modifiers) 인데요!
이 기능 덕분에 정규 표현식을 더욱 유연하고 효율적으로 사용할 수 있게 되었답니다.
이 글에서는 패턴 수정자가 뭔지, 어떻게 쓰는지, 그리고 어떤 경우에 유용한지 자세히 알아볼게요.
패턴 수정자는 뭘까요?
기존에는 정규 표현식 플래그(예: i
- 대소문자 구분 안 함)를 정규 표현식 전체에만 적용할 수 있었는데요.
하지만 패턴 수정자 덕분에 이제는 정규 표현식의 일부분에만 플래그를 적용할 수 있게 되었답니다.
마치 정규 표현식 안에 플래그를 직접 넣는 것처럼 말이죠!
예를 들어, 다음 정규 표현식을 보시면 i
플래그가 "HELLO" 부분에만 적용되는 걸 확인할 수 있습니다.
/^x(?i:HELLO)x$/.test('xHELLOx') // true
/^x(?i:HELLO)x$/.test('xhellox') // true
/^x(?i:HELLO)x$/.test('XhelloX') // false
문법은 어떻게 될까요?
문법은 다음과 같이 간단합니다.
(?ims-ims:pattern)
(?ims:pattern)
(?-ims:pattern)
?
다음에 오는 플래그는 활성화됩니다.-
다음에 오는 플래그는 비활성화됩니다.- 하나의 플래그는 활성화 영역과 비활성화 영역에 동시에 나타날 수 없습니다.
- 플래그 없이
(?:pattern)
형태로 사용하면 단순히 캡처링되지 않는 그룹이 됩니다.
이전 예제를 조금 바꿔볼게요. 이번에는 "HELLO" 부분만 대소문자를 구분하고 나머지는 대소문자를 구분하지 않도록 해보겠습니다.
/^x(?-i:HELLO)x$/i.test('xHELLOx') // true
/^x(?-i:HELLO)x$/i.test('XHELLOX') // true
/^x(?-i:HELLO)x$/i.test('XhelloX') // false
어떤 플래그를 지원할까요?
패턴 수정자에서 사용할 수 있는 플래그는 다음과 같습니다.
플래그 | 속성 이름 | ES 버전 | 설명 |
---|---|---|---|
i |
ignoreCase |
ES3 | 대소문자 구분 없이 일치 |
m |
multiline |
ES3 | ^ 와 $ 가 각 줄의 시작과 끝에 일치 |
s |
dotAll |
ES2018 | . 이 줄 바꿈 문자와도 일치 |
v
플래그나 정규 표현식 전체에만 적용되는 플래그(g
등)는 지원하지 않는데요.
정규 표현식의 의미를 너무 복잡하게 만들거나 전체에 적용해야만 의미가 있기 때문입니다.
패턴 수정자, 어떻게 사용할까요?
몇 가지 유용한 사용 사례를 소개합니다.
1. 정규 표현식 일부분의 플래그 변경:
정규 표현식의 일부분에 대해서만 플래그를 변경해야 할 때 유용합니다.
예를 들어, Ron Buckton은 Markdown 파일의 프론트매터 블록을 일치시키는 데 m
플래그를 변경하는 방법을 설명했습니다.
const re = /(?-m:^)---\r?\n((?:^(?!---$).*\r?\n)*)^---$/m;
assert.equal(re.test('---a'), false);
assert.equal(re.test('---\n---'), true);
assert.equal(re.exec('---\n---')[1], '');
assert.equal(re.exec('---\na: b\n---')[1], 'a: b\n');
이 정규 표현식은 어떻게 작동할까요?
- 기본적으로
m
플래그가 활성화되어^
는 줄의 시작,$
는 줄의 끝과 일치합니다. - 하지만 첫 번째
^
는 문자열의 처음과 일치해야 하므로 패턴 수정자를 사용하여m
플래그를 비활성화합니다.
2. 플래그를 정규 표현식 안에 직접 포함:
정규 표현식을 설정 파일(예: JSON)에 저장하거나, Regex+ 라이브러리와 같은 템플릿 리터럴을 사용할 때 유용합니다.
플래그를 외부에서 지정하는 것보다 정규 표현식 안에 직접 포함하는 것이 더 편리할 수 있습니다.
// Regex+ 라이브러리를 사용한 예시 (가상적인 예시입니다)
regex('i')`world` // 플래그를 외부에서 지정
regex`(?i:world)` // 패턴 수정자를 사용하여 플래그를 내부에서 지정
3. 복잡한 정규 표현식의 모듈화:
복잡한 애플리케이션에서는 작은 정규 표현식들을 조합하여 큰 정규 표현식을 만들 수 있는데요.
이때 작은 정규 표현식들이 다른 플래그를 필요로 할 경우 패턴 수정자가 유용합니다.
결론적으로, 패턴 수정자는 정규 표현식을 더욱 세밀하게 제어할 수 있도록 도와주는 강력한 기능입니다.
복잡한 정규 표현식을 작성하거나, 정규 표현식을 다양한 환경에서 사용해야 할 때 특히 유용하니 꼭 활용해 보세요!
'Javascript' 카테고리의 다른 글
TypeScript 성능 향상의 비밀: tsconfig.json 마스터하기 (1) | 2025.01.21 |
---|---|
타입스크립트 Enum 정복: 실전 가이드 & 완벽 대안 (1) | 2025.01.21 |
pnpm 10 주요 변경 사항 정리 (0) | 2025.01.13 |
ECMAScript 2025에 포함될 Import Attributes, 무엇이 달라질까? (0) | 2025.01.13 |
Node.js, 이제 TypeScript를 기본 지원한다! (0) | 2025.01.13 |