使用正则表达式

时间:2017-10-21 17:07:04

标签: javascript regex string-matching

我正在使用包含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来做。
可以实现吗?

2 个答案:

答案 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

使用resModified我们可以获得动态字段及其值的映射。

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

这种方法更复杂,我认为基于String或trie的方法可以用于降低复杂性。