전역 RegExp 혼란
정규 표현식의 전역 플래그(g)는 문자열에서 해당 패턴의 모든 항목을 검색하도록 설계되었습니다. , 첫 번째 것과는 반대로. 그러나 대소문자를 구분하지 않는 플래그(i)와 함께 사용하면 예상한 결과가 나오지 않을 수 있습니다.
문제
다음 시나리오를 고려하세요.
var query = 'Foo B'; var re = new RegExp(query, 'gi'); var result = []; result.push(re.test('Foo Bar')); result.push(re.test('Foo Bar')); // result will be [true, false]
이유
문제가 발생하는 이유는 전역 플래그는 RegExp 개체가 일치가 발생한 마지막 인덱스를 추적하도록 합니다. 후속 일치에서는 검색이 0 대신 이 인덱스에서 시작됩니다. 위의 예에서는 다음과 같은 일이 발생합니다.
console.log(re.lastIndex); // 0 console.log(re.test('Foo Bar')); // true console.log(re.lastIndex); // 6 console.log(re.test('Foo Bar')); // false console.log(re.lastIndex); // 6
보시다시피 두 번째 일치에서는 검색이 0에서 시작되었기 때문에 "false"가 반환되었습니다. 첫 번째 테스트에서 이미 일치가 발생한 인덱스 6입니다.
문제 해결
이 문제를 방지하려면 일치 항목 간에 RegExp 개체의 lastIndex 속성을 재설정할 수 있습니다.
var query = 'Foo B'; var re = new RegExp(query, 'gi'); var result = []; result.push(re.test('Foo Bar')); re.lastIndex = 0; // Reset the last index result.push(re.test('Foo Bar')); // result will be [true, true]
위 내용은 전역 및 대소문자 구분 플래그가 있는 `RegExp`가 예기치 않은 결과를 반환하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!