자바스크립트 정규 표현식의 새로운 힘! 패턴 수정자 알아볼까요?

자바스크립트 정규 표현식의 새로운 힘! 패턴 수정자 알아볼까요?

요즘 자바스크립트 개발하며 정규 표현식 써보면서 꿀팁 하나 알려드릴까 합니다.

 

바로 패턴 수정자(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. 복잡한 정규 표현식의 모듈화:

 

복잡한 애플리케이션에서는 작은 정규 표현식들을 조합하여 큰 정규 표현식을 만들 수 있는데요.

 

이때 작은 정규 표현식들이 다른 플래그를 필요로 할 경우 패턴 수정자가 유용합니다.

 

결론적으로, 패턴 수정자는 정규 표현식을 더욱 세밀하게 제어할 수 있도록 도와주는 강력한 기능입니다.

 

복잡한 정규 표현식을 작성하거나, 정규 표현식을 다양한 환경에서 사용해야 할 때 특히 유용하니 꼭 활용해 보세요!