Вы хотите использовать
(?s)\/([A-Za-z0-9]{1,6})\/((?:(?!\/[A-Za-z0-9]{1,6}\/).)*)
См. Демоверсию regex .
Возможна немного более короткая версия, поскольку в PCRE вы можете рекурсивно захватывать групповые шаблоны с помощью подпрограмм регулярного выражения. Часть \/([A-Za-z0-9]{1,6})\/
может быть обернута собственной группой захвата, и затем вместо повторения шаблона вы можете использовать (?1)
:
(?s)(\/([A-Za-z0-9]{1,6})\/)((?:(?!(?1)).)*)
См. это демо регулярных выражений . Обратите внимание на наличие «технической» группы № 1, она всегда будет присутствовать в результатах матча (-ов).
Однако, если вы предпочитаете эффективность, я бы порекомендовал версию того же регулярного выражения, развернутую в цикле:
\/([A-Za-z0-9]{1,6})\/([^\/]*(?:\/(?![A-Za-z0-9]{1,6}\/)[^\/]*)*)
См. еще одну демонстрацию регулярных выражений
Встроенный модификатор DOTALL (?s)
, позволяющий .
сопоставлять любые символы, включая символы разрыва строки, необходим только для первых двух шаблонов, поскольку третий не содержит, не полагается на точечный шаблон, а скорее на класс отрицанных символов, [^\/]
. Он соответствует любому символу, кроме /
, включая символы разрыва строки.
Детали шаблона
(?s)
- встроенный модификатор DOTALL
\/([A-Za-z0-9]{1,6})\/
- /
, (группа 1) от 1 до 6 буквенно-цифровых символов, /
((?:(?!\/[A-Za-z0-9]{1,6}\/).)*)
- (группа 2) любой символ (.
), 0 или более повторений (*
), который не запускает /[A-Za-z0-9]{1,6}/
соответствующую подстроку
(?1)
- во второй версии регулярных выражений он такой же, как \/[A-Za-z0-9]{1,6}\/
[^\/]*(?:\/(?![A-Za-z0-9]{1,6}\/)[^\/]*)*
= (?:(?!\/[A-Za-z0-9]{1,6}\/).)*
- любые 0+ символов, кроме /
([^\/]*
), а затем 0 или более повторений /
, за которыми не следует соответствующая подстрока [A-Za-z0-9]{1,6}\/
, а 0+ символов - другие чем /
.