Я бы хотел найти самую длинную повторяющуюся строку в строке, реализованную на 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? Я согласен с тем, что это может быть невозможно в однострочном варианте.