Регулярное выражение для сопоставления строки, не содержащей косой черты

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 $)