2010-03-16 2 views
4

AS3에서 RegExp에 대한 도움이 필요합니다.AS3 : 루프 문제가있는 RegExp exec 메서드

patternYouTube = new RegExp ("v(?:\/|=)([A-Z0-9_-]+)", "gi"); 

이 패턴은 유튜브 아이디 비디오를 찾고 있습니다 :

나는 간단한 패턴을 가지고있다. 예를 들어

:

var tmpUrl : String;  
var result : Object; 
var toto : Array = new Array(); 
toto = ["http://www.youtube.com/v/J-vCxmjCm-8&autoplay=1", "http://www.youtube.com/v/xFTRnE1WBmU&autoplay=1"]; 
var i : uint; 

for (i = 0 ; i < toto.length ; i++) 
{ 
    tmpUrl = toto[i]; 
    result = patternYouTube.exec (tmpUrl); 
    if (result.length != 0 && result != null) 
    { 
     trace(result); 
    } 
} 

내가 == 0, 그것은 완벽하게 작동합니다. 플래시가 나를 반환 함 : v/J-vCxmjCm-8,J-vCxmjCm-8

i == 1 일 경우 실패합니다. 내가 == 0, 그것은 완벽하게 작동하는 경우

toto = [ http://www.youtube.com/v/xFTRnE1WBmU&autoplay=1, http://www.youtube.com/v/J-vCxmjCm-8&autoplay=1 ]; 

: 나는 같은 내 배열의 두 문자열을 되 돌리면 null

가 : 플래시 나를 반환 xFTRnE1WBmU

때를 플래시 날을 반환 i == 1, 실패 :

루프의 문제에 대해 알고 계십니까?

+0

을 난 그렇게 확실하지 않다,하지만 "를 누락을하지 않습니다 배열 선언? – jpabluz

답변

5

로벗 RegExps가 JavaScript/ActionScript에서 수행하는 작업은 g입니다. 너 exec 한 번, 당신은 첫번째 시합 exec 그들을 다시 얻고 두 번째 경기를 얻을. g RegExp을 사용하면 모든 경기를 끝내기 전까지 다시 전화해야합니다. 그러면 null이되고 검색은 문자열의 시작으로 재설정됩니다.

이상한 인터페이스이지만, 그게 우리가 붙어있는 부분입니다. 이 동작을 원하지 않으면 new RegExp 생성자에서 'g' 플래그를 생략하십시오. 그러면 매번 첫 번째 경기 만 얻게됩니다.

+1

당신 말이 맞습니다! 도와 줘서 고마워. 이제 너 덕분에 'g'플래그를 이해하기 시작했다. – Boun

3

bobince가 완전하지만 exec()를 호출하기 전에 lastIndex 속성을 0으로 설정할 수도 있습니다. 이제

patternYouTube.lastIndex = 0; 

당신은 같은 음 뭔가를 당신의 g 플래그 케이크를 가지고도 그것을 먹을 ... 또는 어 수 있습니다 ...