Алгоритм (или регулярное выражение) необходимо найти несколько экземпляров чего-либо - PullRequest
5 голосов
/ 24 февраля 2010

Я не уверен, есть ли простой способ сделать это, но есть ли способ найти несколько экземпляров в неизвестной строке? Например:

hellohellohellobyebyebyehello

Не зная значения приведенной выше строки, могу ли я вернуть что-то, что скажет мне, что есть 3 экземпляра "привет" и 3 экземпляра "пока" (однако я не беспокоюсь о последнем привете, так как я ' ищу последовательное повторение. Заранее спасибо!

Ответы [ 5 ]

7 голосов
/ 24 февраля 2010

Может быть, алгоритм Sequitur может помочь: http://sequitur.info/

4 голосов
/ 24 февраля 2010
s = "hellohellohellobyebyebyehello"
s.replace(/(.+)(\1+)/g, function($0, $1) {
    console.log($1 + " repeated " + ($0.length / $1.length) + " times");
});
2 голосов
/ 24 февраля 2010

"testhellohellohellobyebyebyehello".match(/(.+)\1+/)

Здесь написано: «соответствует последовательности не менее 1 символа (.+), а затем ссылается на первое найденное нами \1 хотя бы один раз + или более.

Будет возвращено ["hellohellohello", "hello"], означающее, что hellohellohello соответствует полному выражению (выражение 0), а «hello» соответствует выражению 1 (то, на что мы ссылаемся \1).

Оговорка:
что-то вроде "hahahaha" даст ["hahahaha", "haha"] вместо ["hahahaha", "ha"]. поэтому вам нужно будет использовать вышесказанное с некоторой последующей обработкой, чтобы получить желаемый результат.

0 голосов
/ 24 февраля 2010
var source = "asdhellohellohellobyehellohellohellohelloasdhello";
var key = "hello";
var len = key.length;
var res = 0, tempres, next;
var last = source.indexOf(key);
while(last != -1)
{
  tempres = 0;
  next = last;
  while(true)
  {
    tempres++;
    next += len;
    last = source.indexOf(key, next);
    if(last != next)
      break;
  }
  res = (tempres > res) ? tempres : res;
}
console.log(res);//4
0 голосов
/ 24 февраля 2010

Если вы ищете словарные слова, вы можете загрузить свой лексикон в дерево суффиксов , затем рассмотреть символы вашей строки один за другим и пройтись по своему дереву.Каждый раз, когда вы достигаете листа, вы увеличиваете на единицу соответствующее «слово».

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