Я пишу регулярное выражение для проверки наличия подстроки, содержащей не менее двух повторений некоторого шаблона рядом друг с другом. Я сопоставляю результат регулярного выражения с прежней строкой - если он равен, есть такой шаблон. Лучше сказать на примере: 1010 содержит шаблон 10, и он существует 2 раза в непрерывных рядах. С другой стороны, у 10210 такой шаблон не будет, поскольку эти 10 не смежны.
Что еще, мне нужно найти самый длинный шаблон, и длина равна не менее 1. Я написал выражение, чтобы проверить его ^.*?(.+)(\1).*?$
. Чтобы найти самый длинный шаблон, я использовал не-жадную версию, чтобы соответствовать чему-то перед patter, затем шаблон сопоставляется с группой 1, и снова совпадает та же самая вещь, которая была сопоставлена для group1. Затем остальная строка сопоставляется, создавая равную строку. Но существует проблема, с которой регулярное выражение стремится вернуться после поиска первого шаблона и на самом деле не учитывает, что я намерен сделать эти подстроки до и после кратчайшего (оставив все возможное). Поэтому из строки 01011010
я правильно понял, что это соответствует, но шаблон, хранящийся в группе 1, всего лишь 01
, хотя я бы исключал 101
.
Как я полагаю, я не могу сделать шаблон "более жадным" или "мусор" до и после "более неживого", я могу только придумать, чтобы сделать регулярное выражение менее нетерпеливым, но я не уверен, возможное.
Другие примеры:
56712453289 - no pattern - no match with former string
22010110100 - pattern 101 - match with former string (regex resulted in 22010110100 with 101 in group 1)
5555555 - pattern 555 - match
1919191919 - pattern 1919 - match
191919191919 - pattern 191919 - match
2323191919191919 - pattern 191919 - match
Что бы я получил с помощью текущего выражения (такие же используемые строки):
no pattern - no match
pattern 2 - match
pattern 555 - match
pattern 1919 - match
pattern 191919 - match
pattern 23 - match