2016-10-26 6 views
0

Я пытаюсь написать регулярное выражение, которое будет соответствовать группам ровно из трех символов, которые повторяются в тексте хотя бы один раз. Это простое регулярное выражение: (.{3}).*\g1, используя флаги \ g (global) и \ s (точка также соответствует новой строке). Однако он явно ошибочен, так как он находит только часть групп, которые я надеюсь захватить. Любая идея, как я могу ее улучшить? Вот ссылка на пример ввода https://regex101.com/r/Cuiva1/2
Edit: Вот полный список групп, я в надежде захватить с просьбой в комментарии: GLT, VIW, IWK, KTL, GLT, LTK, LIS, KTX, TXK, XDL, KTLRegex, чтобы соответствовать повторяющимся группам символов

+0

Что вы имеете в виду, «явно неисправен»? Что не так с результатами? – melpomene

+1

Вы можете использовать '(. {3}) (? =. * \ G1)', но это все равно не будет совпадать с перекрывающимися группами. –

+0

@melpomene Он не захватывает каждая группа, которая удовлетворяет условиям, которые я предоставил, например, должна зафиксировать «VIW» в ссылке, которую я предоставил, так как она содержит «VIWKTLVIW» – Marcin

ответ

0

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

/(?>[^A-Z]*+([A-Z]{3}))(?=(?:[^A-Z]*+[A-Z]{3})*?\1)|(?>[^A-Z]*+[A-Z]{3})/g 

Соотношения из индекса 1 будут содержать то, что вы хотите. Если строки не так хорошо отформатированы (т.е. может содержать любую строку длины между повторяющимися узорами, то вы можете использовать более простой шаблон, но вы получите совершенно противоречивые результаты и пропустить несколько матчей.


Я повторно читать ваш желаемый результат, вы не собираетесь добиться этого регулярного выражения. VIW и IWK накладываются друг на друга, что не будет работать в одном preg_match_all(). Просто используйте строковые функции.