2011-12-23 3 views
4

У меня есть следующий код (AS3 & CS 5.5):RegEx не находя все матчи

var regEx:RegExp = new RegExp(/(?:^|\s)(\#[^\s$]+)/g); 
var txt:String = "This #asd is a test tweet #hash1 test #hash2 test"; 

var matches:Object = regEx.exec(txt); 
trace(matches); 

трассировки возвращает '# ASD, # ASD. Я действительно не понимаю, почему это было бы так, как в моем тестовом приложении RegEx «RegExhibit» он возвращает «# asd, # hash1, # hash2», что я и ожидал. Может ли кто-нибудь пролить свет на это, пожалуйста?

Заранее благодарен!

ответ

6

Если вы используете .exec, вы должны запустить его несколько раз, чтобы получить все результаты:

В следующем примере г (глобальный) устанавливается флаг в регулярном выражении, так что вы можете использовать Exec() несколько раз, чтобы найти несколько совпадений:

var myPattern:RegExp = /(\w*)sh(\w*)/ig; 
var str:String = "She sells seashells by the seashore"; 
var result:Object = myPattern.exec(str); 

while (result != null) { 
    trace (result.index, "\t", result); 
    result = myPattern.exec(str); 
} 

Источник: http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/RegExp.html

Лучшая альтернатива пр obably использовать String.match:

Если шаблон является регулярным выражением, чтобы вернуть массив с более чем одной совпадающей подстроки, то (глобальный) флаг г должен быть установлен в регулярном выражении

Примером может служить (не проверено):

var regEx:RegExp = /(?:^|\s)(\#[^\s$]+)/g; 
var txt:String = "This #asd is a test tweet #hash1 test #hash2 test"; 

var matches:Object = txt.match(regEx); 
Смежные вопросы