Регулярное выражение для соответствия URL-маршруту - PullRequest
0 голосов
/ 14 февраля 2020

Я пишу регулярное выражение для сопоставления маршрута с шаблоном /events/awesome-schema/value2/1.

Значения можно описать так:

/events >> static part
awesome-schema >> could be any char, number, _ or -
value2 >> could be any char, number, _ or -
1 >> one or more digit

На данный момент я написал следующее синтаксис ^/events/([a-z]+[0-9_-]*)/?([a-z]+[0-9_-]*)?/?(\d+)?$ но он терпит неудачу.

Есть идеи, почему это неправильно?

Ответы [ 2 ]

2 голосов
/ 14 февраля 2020

Эта часть ([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

0 голосов
/ 14 февраля 2020

Сбой, потому что ([a-z]+[0-9_-]*) будет соответствовать как можно большему количеству строчных букв, чем могут совпадать только [0-9_-] эти символы. Который будет соответствовать -, но оставшаяся строка - schema/value2/1, но ваш шаблон сейчас пытается соответствовать / char, но следующим символом является символ s на данном этапе в вашем примере.

Это исправить ^/events/([a-z0-9_-]*)/([a-z0-9_-]*)/(\d+)$

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...