LINUX.ORG.RU

regex. help.

 


1

2

Доброго всем вечера(или что у вас там).

Надо найти в строке 2 максимальные одинаковые подстроки.

Пытался составить что-то вроде ^.*(.+).*\1.*$, не выходит: находятся одинаковые символы. Потом пробовал ^.*?(.+).*\1.*$ (я так понял *? должен находить как можно меньшее сочетание?) - тоже не вышло. Подскажите в какую сторону копать?

P.S. если хочешь не помочь, а кинуть камень - проходи мимо.



Последнее исправление: CYB3R (всего исправлений: 1)

в сторну документации твоего диалекта регулярных выражений. в перле твой вариант работоспособен.

George
()
Ответ на: комментарий от George

ну я уже понял, что надо в перл лезть. а в стандартном bash такое никак не провернуть? может есть что-то в дополнение к =~ ? или может в sed такое как-нибудь заставить работать? я ни в regex, ни в sed не силён, поэтому спрашиваю.

momo
() автор топика
Последнее исправление: momo (всего исправлений: 1)

проходи мимо.

А ты проходи на ... «сам знаешь куда»

anonymous
()

Ыххх... максимальные? Проблема в том, что большинство движков для регулярок находят leftmost longest match.

^.*?(.+).*\1.*$

Рассмотрим строку «abcabcabcdabcd». Длиннейшая повторяющаяся строка — abcd. Но даже Perl здесь найдёт abc.

Боюсь, что этого не удастся сделать ни в каком движке регулярных выражений, который не является тьюринг-полным. Хотя я не уверен.

proud_anon ★★★★★
()
Последнее исправление: proud_anon (всего исправлений: 1)
Ответ на: комментарий от proud_anon

потому что ищется первое соответствие. но тут такие варианты: либо найти «a», либо «abc». задача найти самой длинное соответствие в один pattern matching не решается, что связано с механизмом поиска соответствий. зато решается ключом /g, циклом, и дальнейшей обработкой результатов

George
()

P.S. если хочешь не помочь, а кинуть камень - проходи мимо.

Хотел помочь, но, дочитав, решил достать из запазухи камень: *Герасим, к сожалению, не гласную выбрал*, сойдет?)

anonymous
()
Ответ на: комментарий от proud_anon

более того,

grep -P -o "(.+)(?=.*\1)"
выдает все совпадения. остается лишь выбрать из них наибольшее по длине. при этом конструкция
(?=)
работает только с ключом -P, в Extended режиме опережающей проверки нет.

George
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.