regex #express #vue-router
#регулярное выражение #экспресс #vue-маршрутизатор
Вопрос:
Я пытаюсь настроить маршрут vue-router
, используя в веб-приложении регулярное выражение, чтобы соответствовать шаблону. Шаблон, который я ищу, — это любая строка, содержащая буквенно-цифровые символы (и подчеркивание) без косых черт. Вот несколько примеров (первая косая черта предназначена только для отображения строки после домена, например example.com /):
/codestack
/demo45
/i_am_long
Строки, которые не должны совпадать, будут:
/data/files.xml
/share/home.html
/demo45/photos
Единственное регулярное выражение, которое я придумал до сих пор, это:
path: '/:Username([a-zA-Z0-9] )'
Это не совсем правильно, потому что оно соответствует всем символам, кроме косой черты. В то время как я хочу сопоставлять только первый набор буквенно-цифровых символов (включая подчеркивание) до появления первой косой черты.
Если маршрут содержит косую черту, например /data/files.xml
, тогда это должно быть совпадение с другим маршрутом регулярных выражений. Поэтому мне также нужен шаблон регулярных выражений, чтобы соответствовать приведенным выше примерам, содержащим косые черты. Теоретически, они могут содержать любое количество косых черт, например /demo45/photos/holiday/2015/bahamas
.
Комментарии:
1. Возможно, как
^w $
для первого, так и^w /(?:w /)*w (?:.w )?$
для второго? См. regex101.com/r/f2NvN6/1
Ответ №1:
Для первой части вы можете сопоставить 1 или более символов слова, которые также будут соответствовать символу подчеркивания.
Якоря ^
и $
утверждают начало и конец строки.
^w $
Для второго вы можете начать сопоставление с символов word, за которыми следует /
В случае большего количества косых черт вы можете при желании повторить первый шаблон в группе.
Последняя часть после шаблона может состоять из 1 или более символов слова с необязательной частью, соответствующей символам точки и слова.
^w /(?:w /)*w (?:.w )?$
Демонстрация регулярных выражений
Если вы хотите сопоставить любой символ, кроме /
, вы можете использовать [^/]
^(?:[^/s] /) [^/s] $
Комментарии:
1. Хотя это отлично тестируется и имеет смысл, по какой-то причине vue-router это не нравится. Если я использую маршрут
path: '/:Username([a-zA-Z0-9] )'
, то происходит совпадение/demo45
. Если я использую ваше регулярное выражение и пытаюсьpath: '/:Username(^w $)'
, я получаю ошибку[Vue Router warn]: No match found for location with path "/demo45"
2. Можно протестировать здесь: forbeslindesay.github.io/express-route-tester где вы помещаете
/:Username(^w $)
вRoute
поле, а затем/demo45
вPath
поле3. Просто заставил его работать, удалив
^
в начале. Так что это должно быть/:Username(w $)