2010-05-25 4 views
0

В ActionScript и Adobe Flex я использую шаблон и regexp (с глобальным флагом) с помощью метода string.match, и он работает так, как хотелось бы, если только совпадение возвращает несколько вхождений одного и того же слова в текст , В этом случае все совпадения для этого слова указывают только на индекс для первого вхождения этого слова. Например, если текст «cat cat cat cat cow» и шаблон - это поиск cat *, метод match возвращает массив из трех вхождений «cat», однако все они указывают только на индекс первого появление cat, когда я использую indexOf в цикле через массив. Я предполагаю, что это как метод string.match (хотя, пожалуйста, дайте мне знать, если я что-то делаю неправильно или что-то не хватает!). Я хочу найти конкретные индексы каждого совпадения, даже если это слово уже было сопоставлено.Как использовать метод string.match для поиска нескольких вхождений одного и того же слова в строку?

Мне интересно, так ли это метод string.match, и если да, то кто-нибудь знает, какой лучший способ сделать это. Благодарю.

ответ

2

Проблема не с методом match, он с indexOf method

function indexOf(val:String, startIndex:Number = 0):int 

поиск строки и возвращает позицию первого вхождения val найденного во время или после startIndex в пределах вызывающей строки.

Вы должны вызвать indexOf с соответствующими startIndex - другими словами, вы, чтобы начать поиск с конца предыдущего матча.

var s:String = "cats dog cat cats cow cat"; 
var matches:Array = s.match(/cats?/g); 
trace(matches.join());// ["cats", "cat", "cats", "cat"] 
var k:Number = 0; 
for(var i:Number = 0; i < matches.length; i++) 
{ 
    k = s.indexOf(matches[i], k); 
    trace("match #" + i + " is at " + k); 
    k += matches[i].length; 
} 

Вы также можете сделать это с помощью regex.exec метод:

var s:String = "cats dog cat cats cow cat"; 
var r:RegExp = /cats?/g; 
var match:Object; 
while((match = r.exec(s)) != null) 
{ 
    trace("Match at " + match.index + "\n" + 
    "Matched substring is " + match[0]); 
}