Найти самую длинную повторяющуюся подстроку в JavaScript с использованием регулярных выражений

Я бы хотел найти самую длинную повторяющуюся строку в строке, реализованную на JavaScript и использующую подход, основанный на регулярных выражениях.

У меня есть PHP реализация, которая при прямом портировании на JavaScript не работает.

Реализация PHP взята из ответа на вопрос «Найти самые длинные повторяющиеся строки?» :

preg_match_all('/(?=((.+)(?:.*?\2)+))/s', $input, $matches, PREG_SET_ORDER);

Это заполнит $ совпадений [0] [X] (где X - длина $ совпадений [0] ) самой длинной повторяющейся подстрокой. находится в $ input . Я протестировал это со многими входными строками и убедился, что вывод правильный.

Ближайший прямой порт в JavaScript:

var matches = /(?=((.+)(?:.*?\2)+))/.exec(input);

Это не дает правильных результатов

input                  Excepted result   matches[0][X]
======================================================
inputinput             input             input
7inputinput            input             input
inputinput7            input             input
7inputinput7           input             7
XXinputinputYY         input             XX

Я недостаточно знаком с регулярными выражениями чтобы понять, что делает используемое здесь регулярное выражение.

Конечно, есть алгоритмы, которые я мог бы реализовать, чтобы найти самую длинную повторяющуюся подстроку. Прежде чем я попытаюсь это сделать, я надеюсь, что другое регулярное выражение даст правильные результаты в JavaScript.

Можно ли изменить указанное выше регулярное выражение так, чтобы ожидаемый результат возвращался в JavaScript? Я согласен с тем, что это может быть невозможно в однострочном варианте.

5
задан Community 23 May 2017 в 12:03
поделиться