通过正则表达式进行JSON路由匹配

时间:2018-09-27 06:17:33

标签: javascript json node.js

考虑到我有以下JSON对象

.trimText{
    white-space: nowrap;
    overflow: hidden; 
    text-overflow: ellipsis
}

,如果我有字符串var urls = { "GET/users/:id":1, "POST/users":0 } 。如何使用它作为从JSON网址中获取值的键,即"GET/users/10"应该与"GET/users/10"匹配。

我不想迭代urls JSON并为每个键使用正则表达式。

是否可以使用正则表达式访问JSON对象?

谢谢。

5 个答案:

答案 0 :(得分:2)

这应该对您有用。我从Durandal router's RegEx matching logic中提取了一些片段,这些片段基本上是根据定义的路由字符串动态创建regular expression object,然后将tests与传递的字符串相对应。

这是工作示例:

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中定义的每个现有路线创建一个RegExp,并尝试将其与提供的string route进行匹配。 find就是这样做的。如果找到一个,我们将其退回。

由于我们正在执行Object.entries,因此我们返回包含结果的0索引。

由于这是直接从Durandal位获得的,因此它支持在Durandal中内置的所有路由表达式...例如:

  • 静态路由:tickets
  • 参数化:tickets/:id
  • 可选参数:users(/:id)
  • Splat路线:settings*details

您可以阅读有关Durandal Router here

的更多信息

答案 1 :(得分:0)

根据您的问题,我可以理解的是您的密钥是动态的,因此您可以执行以下操作:

var urls = {
  "GET/users/:id":1,
  "POST/users":0
}
let id = 10

const yourValue = urls["GET/users/" + id]

答案 2 :(得分:0)

您可以使用此代码

var urls = {
  "GET/users/:id":1,
  "POST/users":0
}
var regex = /"([^"]+?)"\s*/g;
var urlsJson = JSON.stringify(urls);
let result = regex.exec(urlsJson)
if(result && result.length > 0) {
  var keyJson = result[1];
  var value = urls[keyJson]
  console.log('value', value)
}

答案 3 :(得分:0)

尝试这样的事情:

const urls = (id) => ({
   [`GET/users/${id}`]:1,
    "POST/users":0,   
});

console.log(urls(2));

我希望它会有所帮助。

答案 4 :(得分:0)

json看起来不错,只需对url进行替换,因此将结尾整数替换为:id,然后您便拥有了可直接访问json中值的键。 所以:

var url = "GET/users/10";

var urls = {
  "GET/users/:id":1,
  "POST/users":0
}


url = url.replace(/users\/\d+/, 'users/:id');
console.log(urls[url]);

对url进行尽可能多的替换,以将所有可能的url转换为json中的键。