У меня есть документ REST, содержащий список форматов URL.
/com/shop/product/{product_id}
/com/shop/{shop_id}
/com/city/{city_name}/shop/{shop_id}/details
так далее..
И динамические URL-адреса выглядят примерно так:
/com/shop/product/0ab12h
/com/shop/j8khdj
/com/city/bangalore/shop/78hj67/details
Мой ввод будет динамическим URL.
И при передаче любого из динамического URL-адреса я хочу найти сопоставленный документированный URL-адрес вместе с отображением динамических значений и полей, помеченных в фигурных скобках.
Как для /com/city/bangalore/shop/78hj67/details
URL-адрес /com/city/{city_name}/shop/{shop_id}/details
И карта должна быть
city_name -> bangalore
shop_id -> 78hj67
Я смог добиться этого с помощью обычных операций с строкой. Но я хочу сделать это с REGEX.
Можно ли это сделать?
Решить это с помощью регулярного выражения не особо сложно.
Для вашего приведенного выше примера вы можете использовать: (?:city\/)(\w+)(?:\/shop\/)(\w+)
и найти ответы в матчах 1 и 2 (по ссылке в шаблоне, чтобы получить подробное объяснение шаблона).
const regex = /(?:city\/)(\w+)(?:\/shop\/)(\w+)/g;
const str = '/com/city/bangalore/shop/78hj67/details ';
let m;
while ((m = regex.exec(str)) !== null) {
// This is necessary to avoid infinite loops with zero-width matches
if (m.index === regex.lastIndex) {
regex.lastIndex++;
}
// The result can be accessed through the 'm'-variable.
m.forEach((match, groupIndex) => {
console.log('Found match, group ${groupIndex}: ${match}');
});
}
Поскольку вам, похоже, нужны разные части динамических URL-адресов, вы, вероятно, не сможете создать одно регулярное выражение, которое сделает все для вас. Вместо этого вы вынуждены писать несколько шаблонов, что, вероятно, не лучше, чем при использовании обычных строковых операций.
Я принял предложенный выше подход.
Обычно мы сопоставляем список строк с использованием одного регулярного выражения.
Но здесь его обратное. Каждый документированный URL-адрес является регулярным выражением, и его необходимо сопоставить с динамическим URL-адресом.
Итак, в цикле итерации,
документированный URL-адрес будет выбран один за другим и преобразован в регулярное выражение.
// As fields inside curly braces can contain special characters
// using /\{[^}]+\}/g as regex
// As dynamic URL won't contain special chars replacing it with (\w+)
// Using () to group the dynamic fields
var regexUrl = docUrl.replace(/\{[^}]+\}/g, "(\\w+)");
regexUrl = "^" + regexUrl + "$";
var res = dynUrl.match(regexUrl);
Если регулярное выражение соответствует шаблону, res
будет содержать динамические значения URL-адреса.
// Fetching dynamic fields from URL
var dynFields = docUrl.match(/\{[^}]+\}/g);
Используя dynFields
и res
мы можем иметь карту динамических полей и ее значений.
Проверьте скрипт https://jsfiddle.net/jr9zx1xe/
Этот подход более сложный, я думаю, что метод String или trie может быть полезен для уменьшения сложности.