2017-10-21 46 views
1

我有一个包含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来做。
可以实现吗?

+1

Stackoverflow不是一个免费的代码写入服务。显示你现在有什么,需要改变什么 – charlietfl

+0

早些时候我使用'/'分割了动态url。我还得到了包含动态值的所有子字符串。我正在遍历文档网址。我正在拆分并再次收集子字符串。然后比较我得到匹配的URL连同映射的字段。 – Shree

+0

在问题中显示该代码。本网站的目标是帮助你解决**你的代码**不是从头开始写的。此外,如果您的代码工作,可能会更好地询问https://codereview.stackexchange.com/ – charlietfl

回答

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}`); 
    }); 
} 

既然你似乎需要动态URL的不同部分,你可能不能够拿出一个单一的正则表达式,做一切你。相反,你不得不编写多个模式,这可能不会比使用普通字符串操作更好。

0

我采取了上述答案中提出的方法。
通常我们使用一个正则表达式匹配一个字符串列表。
但是在这里,它反过来说,每个记录的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); 

使用dynFieldsres我们可以有地图动态域和它的价值。

请检查小提琴https://jsfiddle.net/jr9zx1xe/

这种方法比较复杂,我觉得字符串或基于特里树的方法可以在降低复杂性是有用的。

+0

不错。很高兴你能想出一个有效的解决方案。 – wp78de

相关问题