我正在使用包含URL格式列表的REST文档。
/com/shop/product/{product_id}
/com/shop/{shop_id}
/com/city/{city_name}/shop/{shop_id}/details
等。
动态网址如下所示
/com/shop/product/0ab12h
/com/shop/j8khdj
/com/city/bangalore/shop/78hj67/details
我的输入将是一个动态URL。
在传递任何动态URL时,我想找到匹配的文档化URL以及动态值的映射和用大括号标记的字段。 />
喜欢为
/com/city/bangalore/shop/78hj67/details
匹配的网址为
/com/city/{city_name}/shop/{shop_id}/details
地图应该是
city_name -> bangalore
shop_id -> 78hj67
我能够通过正常的字符串操作实现它。但是我想用REGEX来做。
可以实现吗?
答案 0 :(得分:1)
用正则表达式解决这个问题并不是特别困难。
对于上面的示例,您可以使用:(?: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}`);
});
}
由于您似乎需要动态网址的不同部分,因此您可能无法想出一个为您完成所有操作的正则表达式。相反,您被迫编写多个模式,这可能不比使用普通的字符串操作更好。
答案 1 :(得分:0)
我采取了上述答案中建议的方法。
通常我们使用一个正则表达式匹配字符串列表。
但是反过来说,每个记录的URL都是一个正则表达式,它需要与动态URL匹配
因此,在迭代循环中,一个记录的URL将逐个被选中并转换为正则表达式。
res
如果正则表达式与模式匹配, // Fetching dynamic fields from URL
var dynFields = docUrl.match(/\{[^}]+\}/g);
将包含网址的动态值。
dynFields
使用res
和Modified
我们可以获得动态字段及其值的映射。
请检查小提琴https://jsfiddle.net/jr9zx1xe/
这种方法更复杂,我认为基于String或trie的方法可以用于降低复杂性。