AS3: метод exEx RegExp в цикле проблемы - PullRequest
4 голосов
/ 16 марта 2010

Мне нужна помощь по поводу RegExp в AS3.

У меня есть простой шаблон:

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

Этот шаблон ищет видео id 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);
     }
}

Когда я == 0, это работает отлично. Flash возвращает меня: v/J-vCxmjCm-8,J-vCxmjCm-8

Когда я == 1, происходит сбой. Flash возвращает меня: null

Когда я возвращаю две строки в моем массиве, такие как:

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

Когда я == 0, он отлично работает: Flash возвращает меня: xFTRnE1WBmU

Когда я == 1, происходит сбой: Flash возвращает меня: null

Есть ли у вас представление о проблеме в цикле?

Ответы [ 2 ]

5 голосов
/ 16 марта 2010

Вот что g lobal RegExps делает в JavaScript / ActionScript. Вы exec их один раз, вы получите первый матч, exec их снова и получите второй матч. С g RegExp вы должны продолжать звонить снова, пока не пройдете все матчи. Тогда вы получите null, и поиск будет сброшен до начала строки.

Это странный интерфейс, но это то, с чем мы застряли. Если вам не нужно это поведение, опустите флаг 'g' в конструкторе new RegExp. Тогда вы получите только первый матч, каждый раз.

3 голосов
/ 19 мая 2012

bobince совершенно прав, но вы также можете установить для свойства lastIndex значение 0 перед вызовом exec ().

patternYouTube.lastIndex = 0;

Теперь вы можете съесть свой торт с флагом и съесть его тоже ... или что-то в этом роде ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...