2016-08-24 3 views
1

내가자바 스크립트

var myRe = /ab*/g; 
var str = 'abbcdefabh'; 
var myArray; 
while ((myArray = myRe.exec(str)) !== null) { //confused by this line 
    var msg = 'Found ' + myArray[0] + '. '; 
    msg += 'Next match starts at ' + myRe.lastIndex; 
    console.log(msg); 
} 

내가 while 루프 라인으로 혼란 스러워요 MDN https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/exec에서 다음 코드를 해석하는 데 문제가 일치합니다. 그것은 문자열 str에 exec를 호출 한 결과로 myArray를 설정하는 것으로 보이며 null이 아닌 경우 계속 진행된다고 말합니다.

내가 얻지 못한 것은 프로그램에서 일치 항목이있는 마지막 색인에서 검색을 시작한다는 것을 알 수 있습니다. 나에게 이것은 무한 루프가되어야한다. b/c 배열의 다음 인덱스에서 검색을 시작하는 위치를 볼 수 없다.

또한 match를 사용하는 대신 여러 개의 일치 항목을 찾으려면 exec를 사용해야하는 이유가 있습니까? https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/match

답변

0

는 내가하지 않는 것은 프로그램이 정규 표현식의 마지막 인덱스에서

을 검색 myRe.exec 구문 분석을 시작해야하는 위치 지시 속성 .lastIndex가 시작 알고있는 방법이다.

.exec은 한 번에 한 조각 씩 문자열을 구문 분석하려는 경우에 유용합니다.

.exec의 작동 방식에 대한 자세한 내용은 this page on MDN을 참조하십시오.

1

lastIndex 값은 정규식 엔진에 의해 수정 내부적으로 당신이 RegExp#exec에 글로벌 수정와 정규식 합격 한 후. 정규 표현식은 "g" 플래그를 사용하는 경우

, 당신은 동일한 문자열에서 연속 일치를 찾기 위해 exec() 방법을 여러 번 사용할 수 있습니다. 이렇게하면 정규 표현식의 lastIndex 속성 (test()lastIndex 속성으로 넘어갑니다)에서 지정한 문자열의 하위 문자열에서 검색이 시작됩니다.

정확한 RegExp#exec 사양은 15.10.6.2 RegExp.prototype.exec(string)을 참조하십시오. 특히 :

    글로벌사실,
      경우 ●
  1. 을. "는 lastIndex", 전자, 진정한인수 의 [[넣어] 내부 메서드 R를 호출합니다. 패턴이 unancored 빈 문자열과 일치하지 않기 때문에

무한 루프가 발생할 수 없습니다. var myRe = /ab*/g;이므로 a은 유효한 일치 항목을 반환하기 위해 입력에 소문자입니다. var myRe = /a*/g;이면 무한 루프가 발생합니다.

또한 Zero-Length regexes and infinite matches? 스레드를 확인하십시오.