Skip to content

Files

Latest commit

 

History

History
99 lines (62 loc) · 3.84 KB

File metadata and controls

99 lines (62 loc) · 3.84 KB

이스케이프, 특수 문자

본 바와 같이 백슬래시 pattern:\는 문자 클래스(예:pattern:\d)를 나타내는 데 사용됩니다. 따라서 이는 정규식(일반 문자열과 같이)의 특수 문자입니다.

정규식에서 특별한 의미가 있는 다른 특수 문자도 있습니다. 이는 보다 강력한 검색에 사용됩니다. 다음은 전체 리스트 pattern:[ \ ^ $ . | ? * + ( ) 입니다.

리스트를 기억하려 하지 마세요 각각 다룰 것이고 곧 알게 될 겁니다.

이스케이프

문자 그대로 점을 찾는다고 해봅시다. 모든 글자가 아니라 진짜 점을 찾습니다.

특수 문자를 일반 문자로 사용하려면, 백슬래시pattern:\.를 붙입니다.

"문자 이스케이프"라고도 합니다.

예시:

alert( "Chapter 5.1".match(/\d\.\d/) ); // 5.1 (일치 항목!)
alert( "Chapter 511".match(/\d\.\d/) ); // null (진짜 점\.를 찾고 있습니다)

괄호도 특수 문자이기 때문에 pattern:\(를 사용해야 합니다. 아래 예제에서 문자열"g()"를 찾아보겠습니다.

alert( "function g()".match(/g\(\)/) ); // "g()"

백슬래시 \를 찾고 있다면 일반 문자열과 정규식에서 모두 특수 문자이기 때문에 두 번 작성해야 합니다.

alert( "1\\2".match(/\\/) ); // '\'

슬래시

슬래시'/'기호는 특수 문자가 아니지만, 자바스크립트에서는 정규 표현식pattern:/...pattern.../을 열고 닫는 데 사용하기 때문에 이 문자도 이스케이프 해야 합니다.

슬래시'/'를 찾는 방법은 다음과 같습니다.

alert( "/".match(/\//) ); // '/'

반면에, pattern:/.../을 사용하지 않고 new RegExp을 사용해 새로운 정규식을 만든다면 이스케이프 할 필요가 없습니다.

alert( "/".match(new RegExp("/")) ); // finds /

새로운 정규식

new RegExp으로 새로운 정규 표현식을 만드는 경우 /를 이스케이프 할 필요가 없지만 다른 이스케이프 처리해야 합니다.

예를 들어, 이 경우를 생각해 보세요.

let regexp = new RegExp("\d\.\d");

alert( "Chapter 5.1".match(regexp) ); // null

이전의 유사한 예제pattern:/\d\.\d/는 잘 작동했지만 new RegExp("\d\.\d")는 작동하지 않는데 왜 그럴까요?

백슬래시는 문자열에 의해 "소비"되기 때문입니다. 기억하듯이 일반 문자열에는 \n과 같은 각자의 특수 문자가 있으며 백슬래시는 이스케이프에 사용됩니다.

"\d.\d"의 예를 보겠습니다.

alert("\d\.\d"); // d.d

문자열 따옴표는 백슬래시를 "소비"하여 문장을 마음대로 해석하는데 예시를 살펴보겠습니다.

  • \n -- 줄 바꿈 문자,
  • \u1234 -- 해당 코드를 의미하는 유니코드 문자,
  • ...pattern:\d\z같이 특별한 의미를 갖지 않으면 백슬래시는 제거됩니다.

그래서 new RegExp는 백슬래시가 없는 문자열을 받습니다. 검색이 동작하지 않는 이유입니다!

문자열 따옴표가 \\\으로 바꾸기 때문에 이 문제를 해결하기 위해서는 백슬래시를 두 배로 사용해야 합니다.

*!*
let regStr = "\\d\\.\\d";
*/!*
alert(regStr); // \d\.\d (correct now)

let regexp = new RegExp(regStr);

alert( "Chapter 5.1".match(regexp) ); // 5.1

요약

  • 특수 문자pattern:[ \ ^ $ . | ? * + ( )를 문자 그대로 검색하려면 백슬래시\를 앞에 붙여야 합니다. ("특수 문자 이스케이프 하기")
  • pattern:/.../안에 사용 된 /도 이스케이프 해야 합니다. (new RegExp에서는 필요 없습니다).
  • 문자열new RegExp을 전달할 때 문자열 따옴표가 백슬래시 중 한 개를 사용하기 때문에 두 배의 백슬래시\\가 필요합니다.