2010-03-16 86 views
4

我需要一些關於AS3 RegExp的幫助。AS3:RegExp執行方法循環問題

我有一個簡單的模式:

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

這種模式尋找YouTube編號的視頻。

例如:

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); 
    } 
} 

在i == 0,它完美。 Flash返回我:v/J-vCxmjCm-8,J-vCxmjCm-8

當我== 1時,它失敗。 閃存返回我:null

當我恢復我的數組中的兩個字符串,如:

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

當我== 0,它完美的作品: 閃存返回我:xFTRnE1WBmU

當我== 1,它失敗: Flash返回我:null

你對循環中的問題有什麼想法嗎?

+0

我不敢肯定,但都沒有對「失蹤數組聲明? – jpabluz 2010-03-16 15:56:38

回答

5

這就是 lobal RegExps在JavaScript/ActionScript中所做的。你exec他們一次,你第一場比賽,exec他們再次獲得第二場比賽。使用g RegExp,您必須再次調用它,直到您完成所有匹配。然後你會得到null和搜索將重置爲字符串的開始。

這是一個奇怪的界面,但這就是我們所堅持的。如果您不想要這種行爲,請從new RegExp構造函數中省略'g'標誌。那麼你每次只會得到第一場比賽。

+1

你是完全正確的!謝謝你幫助我。現在我開始理解'g'標誌,謝謝你。 – Boun 2010-03-16 16:32:45

3

bobince是完全正確的,但您也可以在調用exec()之前將lastIndex屬性設置爲0。

patternYouTube.lastIndex = 0; 

現在你可以有你的G標誌魚與熊掌兼得......或Er,嗯類似的東西...