考虑我有以下 JSON 对象
var urls = {
"GET/users/:id":1,
"POST/users":0
}
如果我有字符串“GET/users/10”
。如何使用它作为键从 urls JSON 获取值,即 "GET/users/10"
应匹配 "GET/users/:id"
。
我不想迭代 url JSON 并为每个键使用正则表达式。
有没有办法使用正则表达式访问 JSON 对象?
提前致谢。
最佳答案
这里有一些应该适合你的东西。我从 Durandal router's RegEx matching logic 中获取了一些片段。它基本上动态创建一个 regular expression object基于定义的路由字符串,然后针对传递的字符串进行测试
。
这是工作示例:
var urls = {
"GET/users/:id": 1,
"POST/users": 0
}
const getRouteRegExp = (
routeString,
routesAreCaseSensitive = false,
optionalParam = /\((.*?)\)/g,
namedParam = /(\(\?)?:\w+/g,
splatParam = /\*\w+/g,
escapeRegExp = /[\-{}\[\]+?.,\\\^$|#\s]/g
) => {
routeString = routeString.replace(escapeRegExp, '\\$&')
.replace(optionalParam, '(?:$1)?')
.replace(namedParam, function(match, optional) {
return optional ? match : '([^\/]+)';
})
.replace(splatParam, '(.*?)');
return new RegExp('^' + routeString + '$', routesAreCaseSensitive ? undefined : 'i');
}
const getRouteByString = (string) => {
var resultArr = Object.entries(urls).find(([k, v]) => {
var regEx = getRouteRegExp(k)
return regEx.test(string)
}) || []
return resultArr[0]
}
console.log(getRouteByString('GET/users/10'))
console.log(getRouteByString('POST/users'))
console.log(getRouteByString('POST/users2'))
所以你所拥有的是getRouteRegExp
函数,它是这里的主要功能,它将根据传递的route
组成一个正则表达式对象。
之后,我们为 urls
中定义的每个现有路由创建一个正则表达式,并尝试将其与提供的字符串路由
进行匹配。这就是find
的作用。如果找到,我们会将其退回。
既然我们正在做Object.entries我们返回包含结果的 0 索引。
由于这直接来自 Durandal 位,因此它支持 Durandal 中内置的所有路由表达式...例如:
- 静态路线:
门票
- 参数化:
tickets/:id
- 可选参数:
users(/:id)
- Splat 路线:
设置*详细信息
您可以阅读有关 Durandal Router here 的更多信息
关于javascript - 通过正则表达式进行 JSON 路由匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52530593/