Эта часть ([a-z]+[0-9_-]*)/?([a-z]+[0-9_-]*)?
совпадает до тех пор, пока не будет sh до /value2
.
Следующая (\d+)?
не будет соответствовать значению v
from, что возможно, так как это необязательно, но следующая привязка $
делает шаблон не соответствующим всей строке, так как value2/1
не соответствует.
Вы можете использовать
^/events/[a-z0-9_]+(?:-[a-z0-9_]+)*/[a-z0-9+_]+/[0-9]+$
Пояснение
^
Начало строки /events/
Совпадение буквально [a-z0-9_]+
Совпадение 1+ раз с любым из [a-z0-9_]
(?:
Группа без захвата -[a-z0-9_]+
Совпадение -
и 1+ раз любое из [a-z0-9_]
)*
Закрыть группу и повторить 0+ раз /[a-z0-9+_]+
Совпадение /
и 1+ раз любое из [a-z0-9_]
/[0-9]+
совпадение /
и цифры 1+ $
Конец строки
regex demo
Если части должны начинаться со строчной буквы, как в исходном образце, и возможно совпадение, например awesome-schema--
, вы можете начать совпадение с [a-z]
и использовать [a-z0-9_-]*
для класса персонажа.
^/events/[a-z][a-z0-9_-]*/[a-z][a-z0-9+_]*/[0-9]+$
Regex demo