Я не нашел более чистого способа, чем этот, чтобы решить вашу проблему именно так, как вы ее заявили:
^\/(?:(\w+)(?:\/(\w+)(?:\/(\w+))?)?)?((?<!\/)\/)?$
Вы можете проверить здесь: https://regex101.com/r/FJuJ43/6
Объяснение:
starts with a /: ^\/
rest of unstored group is optional: (?: … )?
may ends with a / unless there is another one just before: ((?<!\/)\/)?$
in the main group, first stored alphanum only subgroup: (\w+)
followed by another optional unstored subgroup, starting with a / and followed by another alphanum only stored subgroup: (?:\/(\w+) … )?
and ditto: (?:\/(\w+))?
Это работает, создавая три группы.
Но я не могу предотвратить, чтобы последний символ был трейлингом /
/ aaa / bbb / ccc / работает также, когда это не должно. Если ты справишься с этим, с тобой все будет в порядке.
Надеюсь, это поможет.