2014-10-29 2 views
0

웹 사이트에서 사용자는 검색 상자에 문자 "o"와 같은 텍스트를 입력합니다.Javascript 간단한 입력에 실패한 RegExp

이 사이트의 자바 스크립트 코드에 다음과 같은 정규 표현식 작성

var filterSubstring = $("#FilterOnSubstringBox").val(); 
var regexp = new RegExp(filterSubstring,"gi"); 

나중에 일부 문자열을 통해 내가 루프에, 그리고 정규 표현식에 대해 그들을 테스트합니다. 나는 경우 insenstive로 테스트하려는, 그래서 "O"와 "O"모두 일치해야합니다 :

for(var i = 0; i < array.length; i++) 
{ 
    var textToSearch = array[i].name; 

    if(!regexp.test(textToSearch)) 
    { 
     alert("NOT OK: " + textToSearch + " DID NOT CONTAIN: " + filterSubstring); 
    } 
    else 
    { 
     alert("OK! " + textToSearch + " CONTAINS: " + filterSubstring); 
    } 
} 

불행하게도, 나는 다음과 같은 이상한 결과를 얻을 수 있습니다. 나는 이것을 보여주기 위해 jsfiddle (http://jsfiddle.net/grs9xpek/)을 만들었다.

문자 'O'필터링 :

OK!: ontwerpbesluitenbundel.dmt CONTAINS: o 
OK!: ontwerpbesluitenbundel_body.xta CONTAINS: o 
NOT OK: ScriptTemplate.docx DID NOT CONTAIN: o 
OK!: ShippingOrder.xta CONTAINS: o 
NOT OK: header.xta DID NOT CONTAIN: o 

-> scriptTemplate.docx가 잘못된 것입니다.

OK!: ontwerpbesluitenbundel.dmt CONTAINS: ont 
NOT OK: ontwerpbesluitenbundel_body.xta DID NOT CONTAIN: ont 
NOT OK: ScriptTemplate.docx DID NOT CONTAIN: ont 
NOT OK: ShippingOrder.xta CONTAINS: ont 
NOT OK: header.xta DID NOT CONTAIN: ont 

'ONT'라는 단어 필터링 -> ontwerpbesluitenbundel_body.xta가 잘못된 것입니다.

왜 그 이름이 정규식에 실패합니까?

+0

피들을 만들 수 있습니까? –

+0

@ k-nut : done, 이제는 더 이상합니다 ... – user1884155

+0

그래서 ... 입력 된 문자열이'filterarray' 문자열 안에 있는지 확인하려고합니까? –

답변

5

글로벌 모드에서 test 메서드는 lastIndex에서 시작합니다. 다른 문자열을 사용하는 경우에도 업데이트되고 재설정되지 않습니다. 수동으로 0으로 재설정하면 문제가 해결됩니다.

... 
    regexp.lastIndex = 0 
    if(!regexp.test(textToSearch)) 
    ... 
+0

이 동작에 대해 자세히 설명하는 설명서 나 참고 자료를 제공해 주시겠습니까? Google은이 문제의 근원을 찾기 위해 내 친구가 아닙니다. 감사합니다 – user1884155

+0

그것은 ECMAScript 사양 (http://www.ecma-international.org/ecma-262/5.1/#sec-15.10.6.2)의 섹션 15.10.6.2 및 15.10.6.3에 자세히 설명되어 있습니다. 글로벌 모드에만 적용됩니다. 나는 이것을 답에 추가했다. – bwt

+0

이 문맥에서 "글로벌"이란 의미는 무엇입니까? 내 jsFiddle에서 regexp가 글로벌 또는 글로벌이 아닌 이유는 무엇입니까 (또는 그렇지 않은지)? – user1884155