Как использовать метод string.match, чтобы найти несколько вхождений одного и того же слова в строке? - PullRequest
0 голосов
/ 25 мая 2010

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

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

1 Ответ

2 голосов
/ 25 мая 2010

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

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]);
}
...