我正在尝试构建自己的 URL 路由匹配引擎,尝试使用正则表达式来匹配路由。
例如,让我们考虑这样一种场景:服务器应用程序允许设置自定义参数化路由,然后在 HTTP 请求调用该路由时执行函数。开发者可以创建以下路由:
/users/:id/doSomething/hello/world/:format/convert它们中的每一个都与不同的请求处理程序/函数相关联。
现在,对于传入请求,服务器应该能够将请求的路径与正确的处理程序相匹配。因此,例如,如果客户端应用程序请求http://myservice.com/users/john/doSomething,服务器应该能够知道所请求的 URL 属于/users/{id}/doSomething路由定义,然后执行关联的处理程序。
就我个人而言,我构建路由匹配器的方式是获取请求的 URL,循环遍历路由定义,如果定义与请求的 URL 匹配,则执行处理程序。棘手的部分是动态参数匹配。
您将如何构建匹配 URL 段的正则表达式?
编辑:
我目前正在使用以下正则表达式来匹配段:([^/\?])+。
例如,要检查请求路径是否属于第一条路线,我会将其与之匹配:
/users/([^/])+/doSomething
这是一个非常宽松的正则表达式。
首先关注开发人员如何创建路线。她必须输入什么才能输入动态参数?那么编写动态参数匹配就会更加容易。
在 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)