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

У меня есть следующая структура URL / пути.Мне нужно регулярное выражение, чтобы соответствовать первые 2 строки.Если в URL есть 3-й путь, регулярное выражение не должно совпадать.

Мысли?

http://somewebsite.foo/aaa
http://somewebsite.foo/aaa/bbb
http://somewebsite.foo/aaa/bbb/ccc

Ответы [ 2 ]

0 голосов
/ 27 февраля 2019

Вы получаете 3 совпадения, потому что ваше регулярное выражение \/aaa(\/.*|) соответствует 3 раза a и захватывает косую черту, за которой следует любой символ в группе захвата, совпадающий с /aaa до конца строки.

Для сопоставленияполный URL-адрес, вы можете сопоставить начало URL-адресов и использовать класс отрицательных символов [^\/], чтобы сопоставить не косую черту и сделать вторую часть необязательной.

^https?:\/\/[^\/]+\/[^\/]+(?:\/[^\/]+)?$
  • ^https?:\/\/ Соответствиеначало URL
  • [^\/]+\ совпадение 1+ раз без косой черты
  • /[^\/]+ совпадение с первым /, за которым не следует /
  • (?:\/[^\/]+)? Используйте тот же шаблон снова, только на этот раз сделайте его необязательным, используя группу без захвата
  • $ Конец строки

regex101 demo

Или, если это aaa и bbb, используйте:

^https?:\/\/[^\/]+\/aaa(?:\/bbb)?$

[
  "http://somewebsite.foo/aaa",
  "http://somewebsite.foo/aaa/bbb",
  "http://somewebsite.foo/aaa/bbb/ccc"
].forEach(x => console.log(x + " ==> " + /^https?:\/\/[^\/]+\/[^\/]+(?:\/[^\/]+)?$/.test(x)));
0 голосов
/ 27 февраля 2019

Вам не нужно регулярное выражение, вы можете использовать URL и split

let a = 'http://somewebsite.foo/aaa'
let b = 'http://somewebsite.foo/aaa/bbb'
let c = 'http://somewebsite.foo/aaa/bbb/ccc'

let test = (input) => {
  return new URL(input).pathname.split('/').length < 4
}

console.log(test(a))
console.log(test(b))
console.log(test(c))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...