RegEx не находит все совпадения - PullRequest
4 голосов
/ 23 декабря 2011

У меня есть следующий код (AS3 и CS 5.5):

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', чего я и ожидал.Кто-нибудь может пролить свет на это, пожалуйста?

Заранее спасибо!

1 Ответ

6 голосов
/ 23 декабря 2011

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

В следующем примере флаг g (global) установлен в регулярном выражении, поэтомуВы можете использовать 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

Возможно, лучшей альтернативой будет использование String.match:

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

Пример должен быть (не проверен):

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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...