与Regex匹配的URL路由

时间:2014-01-12 09:15:19

标签: regex url match

我正在尝试构建自己的URL路由匹配引擎,尝试使用正则表达式匹配路由。

例如,让我们考虑服务器应用程序允许设置自定义参数化路由然后在HTTP请求调用它的路由时执行函数的场景。开发人员可以创建以下路由:

  • /users/:id/doSomething
  • /hello/world
  • /:format/convert

它们中的每一个都将与不同的请求处理程序/函数相关联。

现在,在传入请求中,服务器应该能够将请求的路径与正确的处理程序匹配。因此,例如,如果客户端应用程序请求http://myservice.com/users/john/doSomething,则服务器应该能够告知所请求的URL属于/users/{id}/doSomething路由定义,然后执行关联的处理程序。

就个人而言,我建立路径匹配器的方式是获取请求的URL,遍历路由定义,如果定义与请求的URL匹配,则执行处理程序。棘手的部分是动态参数匹配。

您将如何构建与URL段匹配的正则表达式?

修改

我目前正在使用以下正则表达式来匹配细分:([^/\?])+

例如,要检查请求路径是否属于我将匹配的第一条路线:

/users/([^/])+/doSomething

这是一个非常宽容的正则表达式。

1 个答案:

答案 0 :(得分:4)

解决方案

首先关注开发人员可以创建路线的 。输入动态参数时必须输入什么?然后编写动态参数匹配将更容易。

实施例

在Java中,我最近在泽西岛工作过。以下是如何定义URL路由:

/api/{id:[\dA-F]+}.{type:(?:xml|json|csv)}

一些预期的网址:

/api/EF123.csv
/api/ABC.json
/api/1234567890.xml

匹配器会解析开发人员提供的路由,使用这样的正则表达式来查找动态参数:

{([^:]+)\s*:\s*(.+?)(?<!\\)}

查看演示:http://regex101.com/r/iH1gY3

Regular expression visualization

完成后,匹配器可以动态构建下面的正则表达式以匹配路由:

/api/[\dA-F]+\.(?:xml|json|csv)