>웹 프론트엔드 >JS 튜토리얼 >전역 및 대소문자 구분 플래그가 있는 `RegExp`가 예기치 않은 결과를 반환하는 이유는 무엇입니까?

전역 및 대소문자 구분 플래그가 있는 `RegExp`가 예기치 않은 결과를 반환하는 이유는 무엇입니까?

DDD
DDD원래의
2024-12-21 05:51:10217검색

Why Does `RegExp` with Global and Case-Insensitive Flags Return Unexpected Results?

전역 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.