URL соответствия регулярного выражения с параметрами, указывающими шаблон c, но не строку запроса - PullRequest
0 голосов
/ 22 января 2020

Мой шаблон регулярного выражения:

const pattern = /^\/(test|foo|bar\/baz|en|ppp){1}/i;

const mat = pattern.exec(myURL);

Я хочу соответствовать:

www.mysite.com/bar/baz/myParam/...anything here

, но не

www.mysite.com/bar/baz/?uid=100/..

myParam может быть любой строкой с или без черточек, но только после этого может произойти что-либо еще, например строки запроса, но не сразу после baz.

Tried

/^\/(test|foo|bar\/baz\/[^/?]*|en|ppp){1}/i;

Ничего не работает.

Ответы [ 3 ]

0 голосов
/ 22 января 2020

Для 2 примеров строк вы можете использовать

^[^\/]+\/bar\/baz\/[\w-]+\/.*$

Regex demo

Если вы также хотите использовать чередования, это может выглядеть как

^[^\/]+\/(?:test|foo|bar)\/(?:baz|en|ppp)\/[\w-]+\/.*$
  • ^ Начало строки
  • [^\/]+ Совпадение 1+ раз с любым символом, кроме /
  • \/ Совпадение /
  • (?:test|foo|bar) Матч 1 из вариантов
  • \/ Матч /
  • (?:baz|en|ppp) Матч 1 из вариантов
  • \/ Совпадение /
  • [\w-]+ Совпадение 1+ раз слово char или -
  • \/ Совпадение /
  • .* Совпадение 0+ вхождений любого символа, кроме новой строки
  • $ Конец строки

Regex demo

0 голосов
/ 23 января 2020

Использование негативного взгляда или взгляд назад решит вашу проблему. Есть 2 варианта, не ясных из вопроса:

  1. ?uid=100 не допускается после начальной части /bar/baz, поэтому www.mysite.com/test/bar/baz?uid=100 должно быть действительным.
  2. ?uid=100 не допускается в любом месте в строке, следующей за /bar/baz, что означает, что www.mysite.com/test/bar/baz/?uid=100 также недопустимо.

Опция 1

Вкратце:

\/(test|foo|bar\/baz(?!\/?\?)|en|ppp)(\/[-\w?=]+)*\/?

Объяснение важных частей:

|                        # OR
  bar                    #   'bar' followed by
  \/                     #   '/'   followed by
  baz                    #   'baz'
  (?!                    #   (negative lookahead) so, **not** followed by
    \/?                  #     0 or 1 times '/'
    \?                   #     '?'
  )                      #    END negative lookahead

и

  (                      # START group
    \/                   # '/'
    [-\w?=]+             # any word char, or '-','?','='
  )*                     # END group, occurrence 0 or more times
  \/?                    # optional '/'

Примеры Вариант 1

Вы можете сделать предпросмотр еще более точным, указав c, например, (?!\/?\?\w+=\w+), чтобы явно указать, что ?a=b недопустимо, но это зависит от вас.

Опция 2

Чтобы сделать явным то, что ?a=b недопустимо в любом месте мы можем использовать отрицательный взгляд позади . Давайте сначала найдем решение для , а не , позволяющее * bar/baz предшествовать ?a=b.

Сокращение:

(?<!bar\/baz\/?)\?\w+=\w+

Объяснение:

  (?<!                        # Negative lookbehind: do **not** match preceding
     bar\/baz                 # 'bar/baz'
     \/?                      # optional '/'
  )
  \?                          # match '?'
  \w+=\w+                     # match e.g. 'a=b'

Давайте сделаем эту часть полного регулярного выражения:

\/(test|foo|en|ppp|bar\/baz)(\/?((?<!bar\/baz\/?)\?\w+=\w+|[-\w]+))*\/?$

Объяснение:

\/                            # match '/'
(test|foo|en|ppp|bar\/baz)    # start with 'test', 'foo', 'en', 'ppp', 'bar/baz'
(\/?                          # optional '/'        
  ((?<!bar\/baz\/?)\?\w+=\w+  #   match 'a=b', with negative lookbehind (see above)
  |                           # OR
  [-\w]+)                     #   1 or more word chars or '-'
)*                            # repeat 0 or more times
\/?                           # optional match for closing '/'
$                             # end anchor

Примеры Вариант 2

0 голосов
/ 22 января 2020

Я полагаю, это то, что вы просите:

const myURL = "www.mysite.com/bar/baz/myParam/";
const myURL2 = "www.mysite.com/bar/baz/?uid=100";

const regex = /\/[^\?]\w+/gm;

console.log('with params', myURL.match(regex));
console.log('with queryParams', myURL2.match(regex))
Вы можете проверить это и играть дальше в Regex101 . Более того, если вы используете эту страницу, она говорит вам, что делает то, что в строке регулярного выражения.

Если это не то, о чем вы просили, возник другой вопрос, связанный с вашим, без регулярного выражения: Здесь это

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