17.20 동적으로 정규식 만들기
이 장 초반에서 RegExp 생성자보다는 정규식 리터럴을 쓰는 편이 좋다고 했었습니다.
정규식 리터럴을 쓰면 타이핑하는 수고도 덜 수 있고, 자바스크립트 문자열에서 으레 하는 역슬래시를 사용한 이스케이프도 줄어듭니다.
하지만 RegExp 생성자가 필요할 때도 있는데, 동적으로 정규식을 만들어야 할 때가 그런 경우입니다.
예를 들어 사용자 이름의 배열이 있고 문자열에서 그 배열을 사용해 일치하는 사용자 이름을 찾고 싶다고 합시다.
정규식 리터럴만 써서는 사용자 이름을 알아낼 방법이 없습니다.
다음 예제를 보십시오.
const users = ["mary", "nick", "arthur", "sam", "yvette"];
const text = "User @arthur started the backup and 15:15," + "and @nick and @yvette restored it at 18:35.";
const userRegex = new RegExp(`@(?:${users.join('|')})\\b`, 'g');
text.match(userRegex); // ["@arthur", "@nick", @yvette"]
이 예제에서 사용한 정규식을 리터럴로 만든다면 /@(?:mark|nick|arthur|sam|yvette)\b/g
일 겁니다.
하지만 여기서는 동적으로 정규식을 만들었습니다.
단어 경계 메타 문자인 b
앞에 역슬래시를 두 개 썼습니다.
역슬래시를 두 개 쓰지 않았다면 정규식 엔진은 \b
를 리터럴 문자 b로 판단합니다.