与Regex匹配的URL路由

Mar*_*ark 3 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

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

Ste*_*han 5

解决方案

首先关注开发人员如何创建路线。她必须输入什么才能输入动态参数?那么编写动态参数匹配就会更加容易。

例子

在 Java 中,我最近与 Jersey 一起工作。以下是定义 url 路由的方法:

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

一些预期的网址:

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

匹配器将解析开发人员提供的路由,以使用正则表达式查找动态参数,如下所示:

{([^:]+)\s*:\s*(.+?)(?<!\\)}
Run Code Online (Sandbox Code Playgroud)

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

正则表达式可视化

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

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