Вы получаете 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)));