2015-04-04 4 views
1

Я хотел бы создать регулярное выражение, которое будет захватывать все последовательности букв, которые содержатся по крайней мере дважды в большей строке:Regex - матч избыточных последовательностей

Например, давайте возьмем:

abzabuiabuz => a, b, ab, z, bu, u 

Я думал о взглядах и взглядах, но я не вижу правильного решения.

Большое спасибо за вашу помощь!

EDIT:

Мой первоначальный вопрос найти -a, -b в eu-a us-b eu-c eu-b us-a us-a.

+0

Какой язык вы работаете? –

+0

Я не использую какой-либо конкретный язык, мне просто интересно, можно ли получить этот алгоритм только с регулярным выражением, поскольку я нахожу их очень элегантными. – Gege

ответ

1

Захватите один или несколько символов и сделайте обратную ссылку на эти захваченные символы, а затем поместите весь шаблон в позитивное утверждение.

(?=(.+).*\1) 

DEMO

Получить дублированные символы из индекса группы 1.

+0

Довольно приятное спасибо. – Gege

+0

Вы имеете в виду это https://regex101.com/r/jV2tO0/2 или https://regex101.com/r/jV2tO0/3? –

+0

(- \ w) (? =. *? \ 1) почти отлично, но у меня все еще есть 3 совпадения -a, -b, -a, тогда как я бы хотел их не чаще одного раза, так что -a, -b – Gege

0

Вы можете использовать following regex:

\b\S+-(?:a|b)\b 

Это все слова в строке, заканчивающейся в -a или -b.

eu-a 
us-b 
eu-b 
us-a 
us-a 

В случае, если вам нужно на самом деле получить только -a с и -b с, вы можете использовать регулярные выражения \b\S+(-(?:a|b))\b и захватить Group 1 значений.