regexp lastIndex

정규식 test는 true인데 exec가 동작하지 않는다?!

work!
1
2
3
4
5
6
7
8
9
if (regexp.test(line)) {
// 내부 포인터 재설정
regexp.lastIndex = 0;

let match = regexp.exec(line);
while (match) {
// ...
}
}
  • regexp.lastIndex = 0

잘못된 코드

not work!
1
2
3
4
5
6
7
8
if (regexp.test(line)) {
// 여기서 lastIndex 갱신
let match = regexp.exec(line); // 갱신된 lastIndex부터 검색을 시작해서 첫번째 결과가 스킵됨.
while (match) {
// 라인에 일치하는 패턴이 한개라면 반복문한 한번도 돌지 않음
// ...
}
}
  • 처음에 작성한 코드다
  • 파일의 라인 한 줄 한 줄 읽으면서
  • 정규식 패턴과 일치하는 라인이라면
  • 결괏값을 받도록 만들었는데, 이상하게도 제대로 동작하지 않았다
  • 알고 보니까 test() 메서드도 lastIndex를 갱신했었다…
  • 사실 저 if (regexp.test(line)) {은 필요 없는 코드 같다
  • testexec를 같이 쓸 때 주의가 필요하다

참고