전역 플래그와 test()

아래와 같이 휴대폰 번호가 맞는지 틀린지 판별하는 함수를 사용했다.

function isPhone(phone: number):boolean {
	const reg = /^01(?:0|1|[6-9])(\d{3}|\d{4})(\d{4})$/g;
	return reg.test(phone)
}

console.log(isPhone('01012341234')); // true
console.log(isPhone('01012341234')); // false ?

정규식에 일치하는 값을 여러번 넣었음에도 true, false가 계속 찍혀서 무슨 문제가 싶어서 mdn에 있는 RegExp.test()를 좀 더 주의깊게 읽어보았다.

MDN 사이트
위 링크로 들어가서 살펴보면 전역 플래그와 test() 라고 쓰여진 곳을 발견했다.
정규 표현식에 전역 플래그를 설정한 경우, 정규 표현식의 lastIndex를 업데이트 한다고 한다.

처음 실행하면, 01012345678에서 탐색을 다하면 숫자 8의 자리인 lastIndex10이다. true를 반환하고 lastIndex는 초기화가 되지 않는다.

다시 실행하면, lastIndex10을 가지고 있으므로, 그 이후로 탐색을 시작하는데 탐색되는게 없으므로 false를 반환한다. lastIndex0으로 초기화 된다. RegExp.exec()도 이와 같다.

이를 해결하기 위해서는 전역 플래그를 사용하지 않거나, String.match()를 사용해서 해결하면 된다.

좋은 웹페이지 즐겨찾기