2010-03-16 82 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,嗯类似的东西...