본문 바로가기

web/javascript

js regexp wrong results?


var str = "FRANCE";

var re = new RegExp("[A-z]{2}", "ig");

for(var i=0; i<str.length; i++){
        var substring = str.substr(i, 2);
        console.log("re.test(substring)", substring, re.test(substring));
}


위의 소스를 돌려보면 아래와 같이 모두 true / false 가 번갈아 가면서 나온다.

re.test(substring) FR true
re.test(substring) RA false
re.test(substring) AN true
re.test(substring) NC false
re.test(substring) CE true
re.test(substring) E false

정규식이 두글자의 문자일때 true가 반환되어야 하지만 정상적인 경우에도 false가 나온다.

이는 regExp의 g 옵션때문인데, g는  글러벌 속성으로 마지막으로 통과한 정규표현식의 위치를 기억하고

다음번엔 해당 index부터 시작하게 된다.

위의 경우 첫번쨰  FR을 통과 했으므로 LastIndex = 1이 되고, 다음번 RA를 검사할시 LastIndex가 1이기 때문에 RA에서  A부터 검사하여 false이 리턴된다. 그리고 다시 LastIndex는 0으로 초기화된다.


이렇게 for문 안에서 반복적인 정규표현식을 사용할 경우엔 g옵션을 빼고 사용하거나,

혹은 LastIndex를 지속적으로 0으로 초기화를 해야 한다.

re.lastIndex = 0;


참조 : https://stackoverflow.com/questions/1520800/why-does-a-regexp-with-global-flag-give-wrong-results

'web > javascript' 카테고리의 다른 글

javascript 의 모듈 제공 방법  (0) 2018.09.05
overflow-x 된 DOM에서 마우스 휠로 좌우스크롤 움직이기  (0) 2016.06.29
javascript reduce  (0) 2016.06.10
javascrpt map  (0) 2016.06.09