使用正则表达式从几乎相同的字符串中获取不匹配的子串
我有一个包含URL格式列表的REST文档。
使用正则表达式从几乎相同的字符串中获取不匹配的子串
/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/
这种方法比较复杂,我觉得字符串或基于特里树的方法可以在降低复杂性是有用的。
不错。很高兴你能想出一个有效的解决方案。 – wp78de
Stackoverflow不是一个免费的代码写入服务。显示你现在有什么,需要改变什么 – charlietfl
早些时候我使用'/'分割了动态url。我还得到了包含动态值的所有子字符串。我正在遍历文档网址。我正在拆分并再次收集子字符串。然后比较我得到匹配的URL连同映射的字段。 – Shree
在问题中显示该代码。本网站的目标是帮助你解决**你的代码**不是从头开始写的。此外,如果您的代码工作,可能会更好地询问https://codereview.stackexchange.com/ – charlietfl