Параметры будут соответствовать :[^/]+
, потому что это :
, за которым следует что-либо кроме /
1 или более раз.
Если вы найдете параметры в шаблоне и замените их регулярным выражением, которое будет соответствовать любой строке, вы можете сделать то, что просили.
let template = '/service/:appname/getall'
let url = '/service/blah/getall'
// find params and replace them with regex
template = template.replace(/:[^/]+/g, '([^/]+)')
// the template is now a regex string '/service/[^/]+/getall'
// which is essentially '/service/ ANYTHING THAT'S NOT A '/' /getall'
// convert to regex and only match from start to end
template = new RegExp(`^${template}$`)
// ^ = beggin
// $ = end
// the template is now /^\/service\/([^\/]+)\/getall$/
matches = url.match(template)
// matches will be null is there is no match.
console.log(matches)
// ["/service/blah/getall", "blah"]
// it will be [full_match, param1, param2...]
Редактировать: использовать \w
вместо [^/]
, потому что:
Название параметров маршрута должно состоять из «словесных символов» ([A-Za-z0-9_]). https://expressjs.com/en/guide/routing.html#route-parameters
Я считаю, что это верно для большинства анализаторов, поэтому я обновил свой ответ. Следующие тестовые данные будут работать только с этим обновленным методом.
let template = '/service/:app-:version/get/:amt';
let url = '/service/blah-v1.0.0/get/all';
template = template.replace(/:\w+/g, `([^/]+)` );
template = new RegExp(`^${template}$`);
let matches = url.match(template);
console.log(url);
console.log(template);
console.log(matches);
// Array(4) ["/service/blah-v1.0.0/get/all", "blah", "v1.0.0", "all"]