ES2015에서는 JavaScript 언어에
유니코드를 사용하는 정규 표현식 구문이 크게 개선됨
(/u
) 및 고정 (/y
) 플래그 하지만 그때부터 개발은 멈추지 않았습니다. 포함
TC39 (ECMAScript 표준 기구)의 다른 회원들과 긴밀한 협력을 통해
V8 팀은
표현이 더욱 강력해집니다.
이러한 기능은 현재 자바스크립트에 포함하도록 제안 중입니다. 지정할 수도 있습니다 제안이 완전히 수락되지는 않았지만 이미 TC39 절차의 3단계에 있습니다. 우리는 이러한 기능을 신속하게 디자인하고 제공할 수 있도록 하기 위해 플래그 뒤에 있는 기능 (아래 참조) 해당 제안서 작성자에게 최종 결정되었습니다
다음 블로그 게시물을 통해 이 흥미로운 미래를 미리 살펴볼 수 있습니다. 원하는 경우
다음 예제를 따라 하기 위해 실험용 JavaScript를 사용 설정합니다.
기능을 chrome://flags/#enable-javascript-harmony
에서 이용할 수 있습니다.
이름이 지정된 캡처
정규 표현식은 캡처 또는 그룹이라는 소위 캡처를 포함할 수 있습니다. 캡처는 일치하는 텍스트의 일부를 캡쳐합니다. 지금까지 개발자는 이러한 캡처는 캡쳐합니다.
const pattern = /(\d{4})-(\d{2})-(\d{2})/u;
const result = pattern.exec('2017-07-10');
// result[0] === '2017-07-10'
// result[1] === '2017'
// result[2] === '07'
// result[3] === '10'
그러나 정규 표현식은 이미 읽기, 쓰기, 숫자 참조로 인해 더 복잡해질 수 있습니다. 예를 들면 다음과 같습니다. 특정 패턴의 지수를 결정하기가 까다로울 수 있습니다. 캡처:
/(?:(.)(.(?<=[^(])(.)))/ // Index of the last capture?
게다가 패턴을 변경하면 모든 지표의 지수를 기존 캡처:
/(a)(b)(c)\3\2\1/ // A few simple numbered backreferences.
/(.)(a)(b)(c)\4\3\2/ // All need to be updated.
이름이 지정된 캡처는 향후 제공되는 기능으로 개발자가 캡처에 이름을 할당할 수 있습니다. 문법은 Perl과 비슷하지만 Java, .Net, Ruby:
const pattern = /(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})/u;
const result = pattern.exec('2017-07-10');
// result.groups.year === '2017'
// result.groups.month === '07'
// result.groups.day === '10'
이름이 지정된 캡처는 명명된 역참조 및 다음을 통해 참조할 수도 있습니다.
String.prototype.replace
:
// Named backreferences.
/(?<LowerCaseX>x)y\k<LowerCaseX>/.test('xyx'); // true
// String replacement.
const pattern = /(?<fst>a)(?<snd>b)/;
'ab'.replace(pattern, '$<snd>$<fst>'); // 'ba'
'ab'.replace(pattern, (m, p1, p2, o, s, {fst, snd}) => fst + snd); // 'ba'
이 새로운 기능에 대한 자세한 내용은 사양 제안에서 확인할 수 있습니다.
dotAll 플래그
기본적으로 정규 표현식의 .
Atom은 다음을 제외한 모든 문자와 일치합니다.
(줄 마침 표시자용):
/foo.bar/u.test('foo\nbar'); // false
제안서에는 /s
플래그를 통해 사용 설정된 dotAll 모드가 도입되었습니다. dotAll
모드에서 .
는 줄 종결자와도 일치합니다.
/foo.bar/su.test('foo\nbar'); // true
이 새로운 기능에 대한 자세한 내용은 사양 제안에서 확인할 수 있습니다.
유니코드 속성 이스케이프
ES2015에 유니코드 인식이 도입되면서 갑자기 더 많은 언어가 숫자로 간주될 수 있는 문자(예: 원문자 1) ①; 와 같은 단어나 단어로 간주됩니다. 예를 들어 눈의 한자처럼요. 雪).
둘 다 \d
또는 \w
와 일치시킬 수 없습니다. 의미 바꾸기
이러한 약식은 기존의 정규 표현식 패턴을 손상시킬 수 있습니다.
대신 새로운 속성 이스케이프 시퀀스가
도입되었습니다.
이러한 표현식은
/u
플래그에 의해 결정됩니다.
/\p{Number}/u.test('①'); // true
/\p{Alphabetic}/u.test('雪'); // true
역은 \P
와 일치할 수 있습니다.
/\P{Number}/u.test('①'); // false
/\P{Alphabetic}/u.test('雪'); // false
유니코드 컨소시엄은 수학 기호와 같은 훨씬 더 많은 속성을 정의합니다. 또는 일본어 히라가나 문자:
/^\p{Math}+$/u.test('∛∞∉'); // true
/^\p{Script_Extensions=Hiragana}+$/u.test('ひらがな'); // true
지원되는 유니코드 속성 클래스의 전체 목록은 현재 사양 제안을 제출합니다. 더 많은 예를 보려면 이 유용한 도움말을 참고하세요.
Lookbehind 어설션
전방 탐색 어설션은 JavaScript의 정규 표현식 구문의 일부였음 시작할 수 있습니다. 어설션을 바라보는 상대가 드디어 도입되었습니다. 일부 사용자 꽤 오래전부터 V8에 포함되어 왔다는 것을 기억하실 겁니다. 심지어 내부적으로 Lookbehind 어설션을 사용하여 지정된 유니코드 플래그 구현 되었습니다.
이 이름은 이미 그 의미를 잘 설명하고 있습니다. 이 방법은 Lookbehind 그룹에서 앞에 패턴이 있는 경우에만 일치시킬 패턴입니다. 그것은 일치하는 맛과 일치하지 않는 맛이 모두 제공됩니다.
/(?<=\$)\d+/.exec('$1 is worth about ¥123'); // ['1']
/(?<!\$)\d+/.exec('$1 is worth about ¥123'); // ['123']
자세한 내용은 이전 블로그 게시물을 참조하세요. 어설션 및 관련 V8 테스트 사례의 예시 전용입니다.
감사의 말씀
이 블로그 게시물은 언어 챔피언 Mathias Bynens, Dan Ehrenberg, Claude Pache, Brian Terlson, Thomas Wood, Gorkem Yakin, Irregexp guru 등에서 이를 실현하기 위해 열심히 노력해 왔습니다. 에릭 코리 다른 모든 사용자들도 이 언어 사양과 V8의 구현에 기여했으며 기능을 살펴보겠습니다
여러분도 YouTube에서 준비한 것처럼 새로운 정규 표현식 기능에 있습니다!