본 바와 같이 백슬래시 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
을 전달할 때 문자열 따옴표가 백슬래시 중 한 개를 사용하기 때문에 두 배의 백슬래시\\
가 필요합니다.